我们有一些代码在后台线程它需要弹出一个对话框或其他一些用户交互运行,所以我们做平常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