理解 WPF Dispatcher


解決的問題:一個應用程序是一個進程,一個進程包含幾個線程,其中有一個是主線程,其余的是工作線程。在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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM