하나의 버튼이있는 창이 있습니다.이상한 Dispatcher 동작을 설명하십시오 (숨겨진 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");
});
}
는 2 메시지 상자에 버튼 결과를 클릭합니다. 동시에
는 추적 버튼을 ThreadId 및 호출이을 ThreadId을 위해 같은 번호를 보여줍니다.
그러면 작업자가 주 스레드에서 실행 중입니까? 이 호출을 확인하기 위해 ThisDispatcher.CheckAccess()를 점검하십시오. –
이 예제는 인공적입니다. 나는 오해를 잡기 위해 그것을 만들었습니다. –
MessageBox.Show()는 차단 호출입니다. 즉, "직접"메시지 상자를 클릭하기 전에 Button_Click이 종료되지 않습니다. 각 메시지 상자 앞뒤에 Trace.TraceInformation()을 배치하여 실험했습니다. –