天天看點

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

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

參考以下代碼:

<a></a>

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

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

我們再看看下面的代碼:

再看看運作結果,彈出的對話框中顯示的還是 UIThread,這說明什麼?這說明 UI控件發起的 BeginInvoke 方法所調用的委托無論如何都是在 UI 線程中執行的(這話話的原始語句有待商讨,因為你是用treeView1去BeginInvoke的,可将前面的句子加上如上限定詞“ UI控件發起的”。轉載者備注)。

那 BeginInvoke 究竟有什麼用呢?

在多線程程式設計中,我們經常要在工作線程中去更新界面顯示,而在多線程中直接調用界面控件的方法是錯誤的做法,具體的原因可以在看完我的這篇之後看看

這篇:在多線程中如何調用Winform,如果你是大牛的話就不要看我這篇了,直接看那篇吧,反正那篇文章我沒怎麼看懂。

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

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

而所謂的“一面響應操作,一面添加節點”永遠隻能是相對的,使 UI 線程的負擔不至于太大而以,因為界面的正确更新始終要通過 UI 線程去做,

我們要做的事情是在工作線程中包攬大部分的運算,而将對純粹的界面更新放到 UI 線程中去做,這樣也就達到了減輕 UI 線程負擔的目的了。

而在那段更新樹節點的代碼中,其實唯一起作用的代碼是:System.Threading.Thread.Sleep(100);,它使 UI 線程有了處理界面消息的機會,

其實 數位幽靈 将問題複雜化了,隻要以下的代碼就可以很好的工作了。

沒有整理與歸納的知識,一文不值!高度概括與梳理的知識,才是自己真正的知識與技能。 永遠不要讓自己的自由、好奇、充滿創造力的想法被現實的架構所束縛,讓創造力自由成長吧! 多花時間,關心他(她)人,正如别人所關心你的。理想的騰飛與實作,沒有别人的支援與幫助,是萬萬不能的。

    本文轉自wenglabs部落格園部落格,原文連結:http://www.cnblogs.com/arxive/p/8179845.html,如需轉載請自行聯系原作者

繼續閱讀