私は1つのボタンがあるウィンドウを持っています。奇妙なディスパッチャの動作を説明します(非表示のWPF機能)
コードビハインドはメッセージボックス内のボタンの結果をクリック
private void Button_Click(object sender, RoutedEventArgs e)
{
Trace.TraceInformation("Button ThreadId: {0}", Thread.CurrentThread.ManagedThreadId);
Thread w = new Thread((ThreadStart) Worker);
w.SetApartmentState(ApartmentState.STA); // removing/adding this doesn't make effect
w.Start();
MessageBox.Show("Direct");
}
void Worker()
{
Trace.TraceInformation("Worker ThreadId: {0}", Thread.CurrentThread.ManagedThreadId);
this.Dispatcher.Invoke((Action)delegate
{
Trace.TraceInformation("Invoked ThreadId: {0}", Thread.CurrentThread.ManagedThreadId);
MessageBox.Show("Invoked");
});
}
あります。
同時に、トレースはボタンに同じ数字がと呼び出されますがをスレッドIDスレッドIDを示しています。
次に、ワーカーはメインスレッドで実行していますか? thisDispatcher.CheckAccess()をチェックして、呼び出しが必要であったかどうかを確認します。 –
この例は人工的です。私はおそらく私の誤解をキャッチするためにそれを作成しました。 –
MessageBox.Show()はブロッキング呼び出しです。つまり、「Direct」メッセージボックスをクリックする前にButton_Clickは終了しません。私は各メッセージボックスの前後にTrace.TraceInformation()を配置して実験しました。 –