私はWindows forms
アプリケーションでこの機能を使用するにInvokeRequired。どうして?は、WPF
は、WPF
答えて
WPFは、各コントロールにUIスレッドにアクセスするのではなく、Dispatcher
を使用してメッセージポンプへのアクセスを制御します。
Dispatcher.Invoke
を使用して、WPFアプリケーションのUIスレッドに代理人を追加する必要があります。
InvokeRequired
は、winformアプリケーションでは本当に必要ではなく、WPFアプリケーションで確認する必要もありません。 Invoke
に電話すると、にはが表示され、UIスレッドには含まれていないはずです。特定のメソッドがUIスレッドから呼び出され、バックグラウンドスレッドから呼び出されることがあります。 1つ選択します。特定のメソッドを呼び出す前に呼び出し元にUIスレッドを呼び出すように強制するか(呼び出す必要がないため)、またはメソッドが呼び出されたときに呼び出し元がUIスレッドにないと想定するかのいずれかです。すでにUIスレッドに入っているときにInvoke
を呼び出すことはうまくいきます。 UIスレッドを再起動するときにエラーや問題が発生することはありません(パフォーマンスが非常に低いため、不要なコードを追加しないでください)。あなたがDispatcher.Invoke
代わりのInvoke
呼び出す必要があるので、WPFではDispatcher.CheckAccess()
チェックは、代わりにInvokeRequired
if (!CheckAccess()) {
// On a different thread
Dispatcher.Invoke(() => log_left_accs(arg));
return;
}
WPFでは、Invoke
方法はディスパッチャ上でのCheckAccess
メソッドを使用します。また、InvokeRequired
プロパティはありませんが、ディスパッチャはCheckAccess
メソッドを持っています(なんらかの理由で、インテリセンスに隠されています)。あなたのコードは次のようになります:
delegate void ParametrizedMethodInvoker5(int arg);
void log_left_accs(int arg)
{
if (!Dispatcher.CheckAccess()) // CheckAccess returns true if you're on the dispatcher thread
{
Dispatcher.Invoke(new ParametrizedMethodInvoker5(log_left_accs), arg);
return;
}
label2.Text= arg.ToString();
}
もちろん、あなたがスレッドを作成しているかどうかわからないときにチェックしなければならない状況がたくさんあります。 – Christoph
これまでデータバインドが可能なユーザーコントロールを作成しましたか?データは通常、別のスレッドによってフェッチされますが、テキストボックスの値を設定することは、別のコントロールでも行うことができます(例えば、ドロップダウンを変更すると、別のデフォルト値=> UIスレッドになります>データベースからの値の割り当て=>ワーカースレッド上にある) – Christoph
By (WinFormsとWPFの両方で)代わりにBeginInvoke()を使用してください。理由は、Invoke()が醜いデッドロックに陥る可能性があるためです。 – Christoph