解決的問題:一個應用程序是一個進程,一個進程包含幾個線程,其中有一個是主線程,其余的是工作線程。在WPF應用程序中,主線程負責接收輸入、處理事件、繪制屏幕等工作,為了使主線程及時響應,用戶創建一些工作線程,工作線程做一些耗費時間和資源的事情,比如解碼和接受網絡數據。這里存在一個問題,由於UI元素是主線程創建的,工作線程不能更新主線程維護的UI元素的顯示。DIspatcher就是解決這個問題的。
如何解決問題:通過調用主線程的Dispatcher,執行Invoke (同步)或者BeginInvoke方(異步)方法,比如
public delegate void NextPrimeDelegate();
startStopButton.Dispatcher.BeginInvoke(
DispatcherPriority.Normal,
new NextPrimeDelegate(CheckNextNumber));
這里startStopButton 就是主線程維護的UI元素。
為什么工作線程不能更新主線程創建的控件?個人推測,WPF的應用程序也是單線程模型的(STAThread =Single Thread Apartment Thread.),假如工作線程可以更新主線程創建的控件,就會出現不安全的問題。比如兩個工作線程賣票,都使票數減1並顯示,兩個工作線程都取得當前票數,都減1后,保存更新,這樣就出現了賣出2張票,總票數只減少了1。