我有一个比较复杂的WPF应用程序,当尝试使用调度程序在UI线程上调用时,似乎会出现“挂起”或者卡住等情况。
大致流程如下:
- 处理按钮的点击事件
- 创建一个新线程(STA),该线程会创建一个新的Presenter和UI实例,并调用方法Disconnect
- Disconnect方法然后在UI上设置一个名为Name的属性
- Name的setter方法使用以下代码设置属性:
if(this.Dispatcher.Thread != Thread.CurrentThread)
{
this.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate{
this.Name = value; // Call same setter, but on the UI thread
});
return;
}
SetValue(nameProperty, value); // I have also tried a member variable and setting the textbox.text property directly.
我的问题是,当调用调度程序的invoke方法时,它似乎每次都挂起,并且调用堆栈指示它在Invoke实现中处于睡眠、等待或加入状态。
那么,我是否做错了什么,可能是明显的或不明显的,或者有更好的方法来跨越到UI线程来设置此属性(以及其他属性)?
编辑: 解决方案是在线程委托结束时(例如执行工作的位置),调用System.Windows.Threading.Dispatcher.Run()。- 感谢所有帮助过我的人。