涉及的课程:
行为:
因为它在这里完美无缺,但随后:
调用线程无法访问此对象,因为它不同 线程拥有它。
几秒钟后按钮会更新。我猜是因为UI线程再次获取控件并更新控件。但是,有更好的方法来解决这个问题吗?
答案 0 :(得分:1)
只有拥有线程才能更新窗口元素(即控件)。
使用Control.Invoke()
方法更改按钮。我有一个小助手班,我写的是为了解决这个问题。
public static class ControlEx
{
public static void DoSafely(this Control control, Action action)
{
if (control.InvokeRequired)
control.Invoke(new Action(() =>
{
action();
Application.DoEvents();
}));
else
action();
}
}
所以不要做类似的事情:
button.Text = "new text";
来自另一个帖子,我现在打电话给
button.DoSafely(() => button.Text = "new text");
答案 1 :(得分:1)
要扩展Uebercoder的答案,您可能不关心视图模型中的控件,但仍需要将后台更新编组到主线程上。
因此,无论是在后台工作者中,还是在主视图模型中,您都需要执行以下操作:
Application.Current.Dispatcher.BeginInvoke((Action)(() => { /* update properties */ } )));