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