国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#中Invoke 和 BeginInvoke 的真正涵義

2019-10-29 21:42:47
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了C#中Invoke 和 BeginInvoke 的真正涵義,需要的朋友可以參考下

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

參考以下代碼:

 

 
  1. public delegate void treeinvoke(); 
  2. private void UpdateTreeView() 
  3. MessageBox.Show(System.Threading.Thread.CurrentThread.Name); 
  4. private void button1_Click(object sender, System.EventArgs e) 
  5. System.Threading.Thread.CurrentThread.Name = "UIThread"
  6. treeView1.BeginInvoke(new treeinvoke(UpdateTreeView)); 

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

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

我們再看看下面的代碼:

 

  1. public delegate void treeinvoke(); 
  2. private void UpdateTreeView() 
  3. MessageBox.Show(Thread.CurrentThread.Name); 
  4. private void button1_Click(object sender, System.EventArgs e) 
  5. Thread.CurrentThread.Name = "UIThread"
  6. Thread th = new Thread(new ThreadStart(StartThread)); 
  7. th.Start(); 
  8. private void StartThread() 
  9. Thread.CurrentThread.Name = "Work Thread"
  10. treeView1.BeginInvoke(new treeinvoke(UpdateTreeView)); 


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

那 BeginInvoke 究竟有什么用呢?

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

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

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

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

而在那段更新樹節點的代碼中,其實唯一起作用的代碼是:System.Threading.Thread.Sleep(100);,它使 UI 線程有了處理界面消息的機會,其實 數碼幽靈 將問題復雜化了,只要以下的代碼就可以很好的工作了。

 

  1. private void button1_Click_(object sender, System.EventArgs e) 
  2. TreeNode tn; 
  3. for(int i=0;i<100000;i++) 
  4. tn=new TreeNode (i.ToString()); 
  5. this.treeView1.Nodes[0].Nodes.Add(tn); 
  6. if (i%100 == 0) Application.DoEvents(); 
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 专栏| 大渡口区| 苏州市| 陈巴尔虎旗| 衡水市| 元阳县| 宁德市| 沁源县| 喜德县| 牙克石市| 茶陵县| 永仁县| 桃园市| 万全县| 历史| 陇南市| 山丹县| 平远县| 古田县| 唐海县| 嵩明县| 含山县| 合阳县| 长阳| 建湖县| 瑞金市| 东莞市| 且末县| 彭阳县| 澎湖县| 台中县| 招远市| 伊金霍洛旗| 宿州市| 阿图什市| 鄂州市| 礼泉县| 正定县| 嘉定区| 宁都县| 化德县|