關於C#的Invoke與BeginInvoke

 實戰中碰到的一個問題,帖出來與大家分享。

 

關於用子線程刷新主線程創建的控件的問題,當時很頭疼,後來在網上找到解決辦法。轉貼如下,最精華的幾句話用粗體字標出!

 

BeginInvoke 方法真的是新開一個線程進行異步調用嗎?

參考以下代碼:

 

看看運行結果,彈出的對話框中顯示的是 UIThread,這說明 BeginInvoke 所調用的委託根本就是在 UI 線程中執行的。

既然是在 UI 線程中執行,又何來“異步執行”一說呢?

我們再看看下面的代碼:

再看看運行結果,彈出的對話框中顯示的還是 UIThread,這說明什麼?這說明 BeginInvoke 方法所調用的委託無論如何都是在 UI 線程中執行的。

BeginInvoke 究竟有什麼用呢?

在多線程編程中,我們經常要在工作線程中去更新界面顯示,而在多線程中直接調用界面控件的方法是錯誤的做法,具體的原因可以在看完我的這篇之後看看這篇:在多線程中如何調用Winform,如果你是大牛的話就不要看我這篇了,直接看那篇吧,反正那篇文章我沒怎麼看懂。

Invoke BeginInvoke 就是爲了解決這個問題而出現的,使你在多線程中安全的更新界面顯示。

正確的做法是將工作線程中涉及更新界面的代碼封裝爲一個方法,通過 Invoke 或者 BeginInvoke 去調用,兩者的區別就是一個導致工作線程等待,而另外一個則不會。

而所謂的“一面響應操作,一面添加節點”永遠只能是相對的,使 UI 線程的負擔不至於太大而以,因爲界面的正確更新始終要通過 UI 線程去做,我們要做的事情是在工作線程中包攬大部分的運算,而將對純粹的界面更新放到 UI 線程中去做,這樣也就達到了減輕 UI 線程負擔的目的了

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章