我有一个管理UI的类,它包含这个方法:
public void SetField(int field, int value)
我有一个委托声明:
public delegate void SetFieldDelegate(int field, int value);
在buttonpress事件中,我在后台线程上调用另一个类的计算成本高的方法。用户界面不会冻结,工作正在进行中。有时候,我想更新UI,我试图使用委托,以避免跨线程操作:
Gui.SetFieldDelegate TestDelegate = new Gui.SetFieldDelegate(gui.SetField);
在繁重的工作方法中,我打电话给:
TestDelegate.Invoke(field, value);
但它仍然是一个无效的跨线程操作。我确信这是微不足道的,但我迷路了。此外,如果有更简单的方法,欢迎任何建议。
答案 0 :(得分:2)
你在委托上调用Invoke
,它对线程没有任何作用 - 它只是同步调用它。
您需要在UI的元素上调用Invoke
,例如
form.Invoke(TestDelegate, value);
改为或BeginInvoke
:
form.BeginInvoke(TestDelegate, value);
假设您正在使用Windows窗体。如果您使用的是WPF或Silverlight,则需要使用Dispatcher.Invoke
或Dispatcher.BeginInvoke
,例如。
form.Dispatcher.BeginInvoke(TestDelegate, value);
答案 1 :(得分:1)
您需要将Dispatcher.BeginInvoke(DispatcherPriority.Input, () => { /* do some UI work - updating etc*/ });
用于WPF,或this.BeginInvoke (new MethodInvoker(() => /* do some UI work - updating etc*/));
用于Winforms。