【发布时间】:2012-07-19 09:35:38
【问题描述】:
我正在使用一个外部组件,它定期从工作线程中拍摄事件。在我的事件处理程序中,我使用 Dispatcher 在主线程上调用某些方法。这很好用...
private void HandleXYZ(object sender, EventArgs e)
{
...
if(OnTrigger != null)
dispatcher.Invoke(OnTrigger, new TimeSpan(0, 0, 1), e);
}
但是,当程序关闭并且外部组件 Dispose()s 时,程序有时会挂起(并且只能在任务管理器中看到和杀死)。
当我查看正在发生的事情时,看起来“组件”正在等待事件在主线程上返回(它停留在 Dispose() 方法中),而工作线程等待调度程序调用提到对主线程的调用(它挂在 dispatcher.Invoke-line 中)。
现在我通过在 Invoke 中添加超时来解决关机问题,这似乎有效但感觉不对。 有没有更清洁的方法来做这样的事情?我可以强制主线程在关闭之前为其他线程的作业花费一些时间吗?
我试图在关闭之前“断开”事件,但这无济于事,因为调度程序(可能)已经在等待,当程序开始关闭时......
PS:外部组件在这里表示我无权访问源代码...
【问题讨论】:
-
请下次使用段落
-
粘贴代码会有很大帮助
标签: c# multithreading deadlock