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.Invokeorを使用する必要があります。Dispatcher.BeginInvoke

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

Dispatcher.BeginInvoke(DispatcherPriority.Input, () => { /* do some UI work - updating etc*/ });WPF またはWinforms のいずれかを使用する必要がありthis.BeginInvoke (new MethodInvoker(() => /* do some UI work - updating etc*/));ます。

于 2013-01-19T12:07:24.567 に答える