编程语言
首页 > 编程语言> > C#等待所有线程在ThreadPool中终止

C#等待所有线程在ThreadPool中终止

作者:互联网

我有一个主线程和许多其他后台线程.

这些后台线程的主要用途是查询数据(来自Web的许多查询,这就是我创建多个线程的原因:避免滞后用户界面).

在主线程(用户界面)中导出数据时,我需要等到所有其他线程都完成.

我的代码是:

//...code to open save file dialog...

//this loop is to wait for all the threads finish their query
//QueryThread.threadCount is the count of the background threads
while (QueryThread.threadCount != 0)
{
    Thread.CurrentThread.Join(1000);
    Console.WriteLine(QueryThread.threadCount);
}

//...code to export data...

如果我评论while循环,程序将顺利运行,但我的一些导出数据将有可能显示一些“不需要的”材料,因为一些后台线程还没有完成他们的工作.

但是,上面的while循环是无限的,threadCount永远不会改变,这意味着在“Join()”方法中,没有后台线程在运行.

为什么后台线程被阻止,我该如何解决问题?

非常感谢!

解决方法:

您的实现是错误的,您不应该使用Join作为线程之间的同步原语.

你应该做的是实现producer-consumer pattern.这将允许你让线程等待工作,然后在你把它放入队列时活着做这项工作.

但是,我要做的更改是,从UI线程,不要将数据直接添加到生产者和消费者共享的队列中.而是,复制该数据,然后将其放入队列中.

有关如何在.NET中实现生产者 – 消费者模式的更多信息,我建议您阅读标题为“How to: Synchronize a Producer and a Consumer Thread (C# Programming Guide)”的MSDN文档

标签:c,multithreading,net-2-0
来源: https://codeday.me/bug/20190610/1213828.html