У меня есть окно с одной кнопкой внутри.Объясните странное поведение диспетчера (скрытая функция 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");
});
}
Нажатие кнопки приводит в окна сообщений.
В то же время, трассировка показывает одни и те же номера для Кнопка ThreadId и Вызывается ThreadId.
Тогда рабочий бежит по основной теме? Проверьте этот.Dispatcher.CheckAccess(), чтобы убедиться, что вызов был необходим. –
Этот пример является искусственным. Я создал его, чтобы поймать свое недоразумение. –
MessageBox.Show() - блокирующий вызов. То есть Button_Click не выходит, прежде чем я нажимаю на поле «Прямой». Я экспериментировал, разместив Trace.TraceInformation() до и после каждого окна сообщения. –