这种事情已经出现在Stack Overflow上,here.但是,它并没有解决问题。
我正在研究一个多线程的概率模拟器。说,我想弄清楚10亿个骰子卷的结果。"如果这运行> 1分钟后,弹出以下消息:
CLR无法从COM上下文
0x29eac30
过渡到COM上下文0x29eab78
60秒。拥有目标上下文/公寓的线程很可能是在非抽空等待或处理非常长时间运行的操作而不抽取Windows消息。这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随时间不断累积。为了避免这个问题,所有单线程单元(STA)线程都应该使用抽取等待原语(例如CoWaitForMultipleHandles
)并在长时间运行期间定期泵送消息。
我的代码包括:
bool done = false;
while (done)
{
done = false;
foreach (WorkerObject w in workers)
{
done = done && w.done;
}
}
我使用Task
个对象进行多线程,并且有一个Task.Wait()
方法,但这是一个线程阻塞操作,它与此基本相同。在循环中使用Thread.Sleep(500)
会得到相同的结果。
现在,我已经用Google搜索了如何实际解决这个问题,而且通常情况下,"修复"是禁用编译器警告并继续使用它,但我如何实际解决问题?