一.編程
wpf中幾乎全部的對象都繼承自DispatcherObject,甚至包括 Application。這些繼承自 DispatcherObject 的對象具備線程關聯特徵,也就意味着只有建立這些對象實例,且包含了 Dispatcher 的線程(一般指默認 UI 線程)才能直接對其進行更新操做。安全
二 .BeginInvoke和Invoke的區別多線程
Invoke:在擁有該控件的基礎窗口句柄的線程上執行制定的委託,也就是會阻塞調用線程。異步
BeginInvoke: 異步,非阻塞。 性能
1. C#多線程 Invoke方法的使用 spa
在多線程編程中,咱們常常要在工做線程中去更新界面顯示,而在多線程中直接調用界面控件的方法是錯誤的作法,Invoke 和 BeginInvoke 就是爲了解決這個問題而出現的,使你在多線程中安全的更新界面顯示。.net
正確的作法是將工做線程中涉及更新界面的代碼封裝爲一個方法,經過 Invoke 或者 BeginInvoke 去調用,二者的區別就是一個致使工做線程等待,而另一個則不會。線程
2.對象
經過一個委託來進行同步方法的異步調用,也是.net提供的異步調用機制之一。可是Delegate.BeginInvoke方法是從ThreadPool取出一個線程來執行這個方法,以得到異步執行效果的。也就是說,若是採用這種方式提交多個異步委託,那麼這些調用的順序沒法獲得保證。並且因爲是使用線程池裏面的線程來完成任務,使用頻繁,會對系統的性能形成影響。繼承
Delegate.BeginInvoke也是講一個委託方法封送到其它線程,從而經過異步機制執行一個方法。調用者線程則能夠在完成封送之後去繼續它的工做。可是這個方法封送到的最終執行線程是運行庫從ThreadPool裏面選取的一個線程。
這裏須要糾正一個誤區,那就是Control類上的異步調用BeginInvoke並無開闢新的線程完成委託任務,而是讓界面控件的所屬線程完成委託任務的。看來異步操做就是開闢新線程的說法不必定準確。