Я хотел бы создать подкласс DispatcherObject
для создания своих собственных объектов, связанных с потоками, с очередью сообщений, как WPF использует для элементов пользовательского интерфейса.
У меня есть тестовое приложение, которое работает без сбоев,но DispatcherObject не обрабатывает свою очередь сообщений.Я только что создал новое пустое приложение WPF и добавил этот код в MainWindow.xaml.cs
:
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
DispatcherWorker worker = null;
ManualResetEventSlim latch = new ManualResetEventSlim(false);
new Thread(() => {
worker = new DispatcherWorker();
latch.Set();
}).Start();
latch.Wait();
// worker.Dispatcher.Thread is stopped by here... why?
worker.Dispatcher.BeginInvoke(new Action(() => {
// This code never executed
worker.DoWork(this);
}));
}
}
public class DispatcherWorker : DispatcherObject {
public void DoWork(MainWindow window) {
VerifyAccess();
window.Dispatcher.BeginInvoke(new Action(() => window.Background = Brushes.Black));
}
}
Метод DoWork()
никогда не выполняется, и если я ставлю точку останова непосредственно перед вызовом BeginInvoke
Я вижу, что поток Диспетчера остановлен.Почему это остановлено?Я неправильно настраиваю поток?
( Похожий вопрос , похоже, имеет ту же проблему, но в принятом ответе говорится, что код запускается в приложении с графическим интерфейсом, в котором будет сообщениенасос. Но я получаю ту же проблему, даже когда работает в приложении с графическим интерфейсом.)