我們有一些代碼在後臺線程它需要彈出一個對話框或其他一些用戶交互運行,所以我們做平常Invoke
呼叫到UI線程:調用與超時
Control.Invoke(SomeFunction);
void SomeFunction()
{
...
}
但是,我們遇到了一個bug,我們的UI線程有時不會立即響應Invoke
調用 - 我們追蹤到UI線程當前正在執行還未返回的跨進程DCOM調用。一旦DCOM調用返回,我們的函數將被調用,但在此之前,似乎Invoke
調用已掛起。
我的這個解決方案是引入超時:
ManualResetEvent invokeEvent = new ManualResetEvent();
var result = Control.BeginInvoke(SomeFunction, invokeEvent);
if (!invokeEvent.WaitOne(1000))
throw new Exception("Not responding");
Control.EndInvoke(result);
void SomeFunction(ManualResetEvent invokeEvent)
{
invokeEvent.Set();
...
}
這曾在「關於我的機器感的作品」,但它有一些缺陷。
http://www.codinghorror.com/blog/images/works-on-my-machine-stamped.png
- 首先功能仍然調用,即使發生超時 - 如果DCOM調用實際上並沒有完全掛起,它最終會
- 其次,有明顯的可怕的種族條件
- 最後是整個事情整個「Arrgh」 -ness
即使第一次兩件事情可以得到解決,我們仍然有根口腔疾病。有沒有更好的方法來解決這個問題?
非常抱歉,我們不擁有使跨進程DCOM調用的代碼。即使我們這樣做了,我們仍然需要在我們自己的代碼中將其作爲一個普遍問題來解決,因爲可能會加載任何其他代碼,這可能會導致這個普遍問題。好主意,但 – 2009-07-20 08:31:30