我想創建一個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'的調用沒有效果。 –