【发布时间】:2014-03-07 13:32:19
【问题描述】:
我生成了多个后台工作线程,并希望我的主线程等到所有线程都完成。解决方案是每次生成后台工作线程时向列表中添加一个项目,并在 RunWorkerCompleted 中删除它们。但是,如何将列表作为参数传递给 RunWorkerCompleted?
FuncA()
{
foreach()
{
/* add an item to the list */
_bw.RunWorkerAsync();
}
m_event.WaitOne(); /* Main thread waits here */
}
static bw_DoWork()
{
}
static bw_RunWorkerCompleted()
{
/* delete item from list */
/* if list is empty signal m_event.Set() */
}
【问题讨论】:
-
你不想阻塞主线程。这将冻结你的用户界面。另外,顺便说一句,它会阻止
RunWorkerCompleted被触发。 -
你能解释一下如果主线程被阻塞,RunWorkerCompleted 是如何被触发的吗?
-
BGW 会将完成的事件编组到主线程,主线程无法处理请求,因为它被阻塞了,直到当前请求完成。在 BGW 完成事件运行之前,它不会完成。死锁。
-
感谢服务。死锁问题是否仅与后台工作线程有关?
-
死锁问题是因为您阻塞了 UI 线程。不要那样做。您不想阻塞 UI 线程。如果您想在所有后台任务完成时(在 UI 线程中)简单地做某事,您可以这样做。我的回答向您展示了一种方法(我认为最简单的方法)。
标签: c# multithreading