当我从工作线程调用UI线程时,发生死锁。事实上,工作线程被阻塞在调用行:从工作线程调用UI线程时发生死锁
return (ucAvancementTrtFamille)mInterfaceTraitement.Invoke(d, new object[] { psFamille });
奇怪的是,在UI线程(其中,纠正我,如果我错了,是主线程)处于闲置状态。
有没有什么办法:
- 看到哪个线程实际上,我试图调用?
- 看看线程真的在干什么?
我们可以在下图中看到工作线程(ID 3732)在Invoke行上被阻塞,并且MainThread在应用程序的主函数中处于空闲状态。
编辑:这是主线程的堆栈:
EDIT2:其实,我暂停了该计划第二次,这里是堆栈的样子:
EDIT3:发现解决方法
我终于找到了解决方法。问题显然是由于异步包装竞赛 条件问题。解决方法是使用BeginInvoke并等待它超时。当它超时时,再次调用并循环直到它最终返回。大多数情况下,它实际上是在第二个电话上工作。
IAsyncResult ar = mInterfaceTraitement.BeginInvoke(d, new object[] { psFamille });
while (!ar.AsyncWaitHandle.WaitOne(3000, false))
{
ar = mInterfaceTraitement.BeginInvoke(d, new object[] { psFamille });
}
// Async call has returned - get response
ucAvancementTrtFamille mucAvancementTrtFamille = (ucAvancementTrtFamille)mInterfaceTraitement.EndInvoke(ar);
这不是很漂亮,但它是我发现的唯一解决方案。
你可以发布'd'委托人在做什么吗? – 2010-09-21 17:46:14
这是一个WinForms或WPF应用程序,对吧? – 2010-09-21 17:48:27
委托只是创建一个图形控件(在这一点上它甚至不会将它添加到任何形式)。我使用WinForms。 – leo 2010-09-22 07:46:37