當我從工作線程調用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