我有两个调度程序:
dispatcher1
dispatcher2
现在,当我调用以下代码(这是我复杂代码的简化示例)时:
var ret = dispatcher1.Invoke(() => {
return dispatcher2.Invoke(() => {
return new object();
});
});
我会在死锁中运行。
调用
dispatcher1.Invoke()
目前正在等待中
DispatcherSynchronizationContext.Wait()
在调用dispatcher2之后
dispatcher2.Invoke()
正在等待中
DispatcherSynchronizationContext.Wait
我无法将Invoke-Calls更改为异步调用(BeginInvoke),因为我需要结果。
在.NET 4.0中并非如此-只有自从我更改为.NET 4.5以来才出现了这种情况。
有没有办法解决这个问题?
DispatcherPriority.Send
调用Invoke()
。这将完全跳过调度程序队列。此外,如果dispatcher1
和dispatcher2
可以是相同的,请使用CheckAccess()
来确定是否可以直接调用委托。 - Mike StrobelDispatcherPriority.Send
时,它仍然是一样的。 - BennoDualdispatcher2
上运行时对dispatcher1.Invoke
的调用导致死锁:dispatcher1.Invoke
阻塞等待dispatcher2.Invoke
,后者执行尝试回调到dispatcher1.Invoke
的代码。基本上,从一个分派程序向另一个分派程序发出阻塞呼叫几乎等同于在请求死锁。 - Mike Strobel