0

我有一个管理 UI 的类,其中包含此方法:

public void SetField(int field, int value)

我有一个代表声明:

public delegate void SetFieldDelegate(int field, int value);

在按钮按下事件中,我在后台线程上调用另一个类的计算量大的方法。UI 没有冻结,工作正在完成。有时,我想更新 UI,但我尝试为此使用委托,以避免跨线程操作:

Gui.SetFieldDelegate TestDelegate = new Gui.SetFieldDelegate(gui.SetField);

在繁重的工作方法中,我调用:

TestDelegate.Invoke(field, value);

但这仍然是无效的跨线程操作。我敢肯定这是微不足道的,但我迷路了。此外,如果有更简单的方法可以做到这一点,欢迎提出任何建议。

4

2 回答 2

2

您正在调用delegate,它不会对线程做任何事情 - 它只是同步调用它Invoke

您需要调用InvokeUI 的元素,例如

form.Invoke(TestDelegate, value);

或者BeginInvoke改为:

form.BeginInvoke(TestDelegate, value);

假设您使用的是 Windows 窗体。如果您使用的是 WPF 或 Silverlight,则需要使用Dispatcher.InvokeorDispatcher.BeginInvoke代替,例如

form.Dispatcher.BeginInvoke(TestDelegate, value);
于 2013-01-19T12:07:49.007 回答
1

您需要使用Dispatcher.BeginInvoke(DispatcherPriority.Input, () => { /* do some UI work - updating etc*/ });WPF 或this.BeginInvoke (new MethodInvoker(() => /* do some UI work - updating etc*/));Winforms。

于 2013-01-19T12:07:24.567 回答