【发布时间】:2008-11-05 02:01:54
【问题描述】:
我有一个有点复杂的 WPF 应用程序,在尝试使用调度程序调用 UI 线程上的调用时,它似乎“挂起”或卡在等待调用中。
一般流程是:
- 处理按钮的点击事件
- 创建一个新线程 (STA):创建演示者和 UI 的新实例,然后调用方法 Disconnect
- Disconnect 然后在 UI 上设置一个名为 Name 的属性
- Name 的设置器然后使用以下代码设置属性:
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()(例如,正在执行工作的位置) - 感谢所有提供帮助的人.
【问题讨论】:
-
@Matthew - 实际上,BeginInvoke 没有什么“非最佳”的;如果您现在绝对不需要更新,那很好。不过,您需要对捕获的变量稍加小心(即,在调用 BeginInvoke 后不要更改“值”。完全如此。)
-
@Matthew - 你根本不加入()新线程,是吗?这可以解释它......
-
@Marc Gravell - 从记忆中我在某个时候加入了线程,但我不确定当我不使用它时行为是否相同。加入的原因是我想在工作完成之前阻止应用程序的其余部分,但也许我可以使用其他方法。
标签: c# .net wpf invoke dispatcher