从代理人的不同线程更新UI

时间:2013-01-19 12:04:38

标签: c# multithreading delegates

我有一个管理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);

但它仍然是一个无效的跨线程操作。我确信这是微不足道的,但我迷路了。此外,如果有更简单的方法,欢迎任何建议。

2 个答案:

答案 0 :(得分:2)

你在委托上调用Invoke,它对线程没有任何作用 - 它只是同步调用它。

您需要在UI的元素上调用Invoke,例如

form.Invoke(TestDelegate, value);
改为

BeginInvoke

form.BeginInvoke(TestDelegate, value);

假设您正在使用Windows窗体。如果您使用的是WPF或Silverlight,则需要使用Dispatcher.InvokeDispatcher.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。