情况
我将尝试用一个小例子来解释我的问题。我有一个管理视图堆栈的类。替换视图显示并初始化它们等。
class ViewManager()
{
void ReplaceView()
{
RemoveView(...);
InitializeView(...); // this code may call Application.DoEvents()
AddNewView(...);
}
void ShowModalView()
{
ShowView();
Dispatcher.PushFrame()
....
// wait until view can be removed
RemoveView();
}
void RemoveView()
{
...
}
// ... more functions
}
因为ViewManager对UI元素做了很多工作,所以其他线程使用ViewManager到Dispatcher.Invoke。
Dispatcher.Invoke(new Action(() => m_viewManager.Remove(someView)));
如果现在多个线程在ViewManager上调用操作,并且其中一个线程在代码Application.DoEvents或DispatcherPushFrame中的某处深入调用,则会生成第二个MessageLoop,它将调用视图管理器中的另一个方法。
问题:
锁定ViewManager内部是没用的,因为它是完全相同的线程。信号量可能会冻结UI线程,因为在“ShowModalView”的Message循环期间,另一个线程可以在调度程序上调用ShowModalView,这将冻结UI线程。
问题:
感谢您的提示和答案
曼努埃尔
修改 一种解决方案可能是摆脱所有DoEvents和PushFrame代码。这很难实现,但可能是唯一正确的解决方案。这篇文章解释了我的问题的一部分
答案 0 :(得分:0)
正如Servy所说,摆脱Application.DoEvents()和Dispatcher.PushFrame是唯一干净的解决方案。有时这会导致很多重构,但值得付出努力。