我想创建一个DispatcherObject
的子类来创建我自己的具有消息队列的线程关联对象,就像WPF用于UI元素一样。继承自DispatcherObject
我有一个测试应用程序运行时没有崩溃,但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
,我看到了Dispatcher的线程停止。为什么停止?我是否设置了线程错误? (This similar question似乎也有同样的问题,但接受的答案表示在一个GUI应用程序中运行代码,这将有一个消息泵,但即使在GUI应用程序中运行,我也遇到同样的问题。 )
我不知道有关线程或你在做什么,但是不会有'.Wait()'调用挂起线程直到某些事情完成,但是某些事情永远不会开始或完成,因为主UI线程正在等待构造函数完成? – Rachel
@Rachel:'Wait()'调用只会等到'ManualResetEventSlim。Set()'调用,这发生在另一个线程上。当我遍历代码时,我可以完全通过构造函数,只是对'worker.Dispatcher.BeginInvoke'的调用没有效果。 –