欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中Invoke 和 BeginInvoke 的真正涵義

 更新時間:2014年10月22日 16:42:42   投稿:mdxy-dxy  
這篇文章主要介紹了C#中Invoke 和 BeginInvoke 的真正涵義,需要的朋友可以參考下

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

參考以下代碼:

public delegate void treeinvoke();
private void UpdateTreeView()
{
  MessageBox.Show(System.Threading.Thread.CurrentThread.Name);
}
private void button1_Click(object sender, System.EventArgs e)
{
  System.Threading.Thread.CurrentThread.Name = "UIThread";
  treeView1.BeginInvoke(new treeinvoke(UpdateTreeView));
}

看看運行結(jié)果,彈出的對話框中顯示的是 UIThread,這說明 BeginInvoke 所調(diào)用的委托根本就是在 UI 線程中執(zhí)行的。

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

我們再看看下面的代碼:

public delegate void treeinvoke();
private void UpdateTreeView()
{
  MessageBox.Show(Thread.CurrentThread.Name);
}
private void button1_Click(object sender, System.EventArgs e)
{
  Thread.CurrentThread.Name = "UIThread";
  Thread th = new Thread(new ThreadStart(StartThread));
  th.Start();
}
private void StartThread()
{
  Thread.CurrentThread.Name = "Work Thread";
  treeView1.BeginInvoke(new treeinvoke(UpdateTreeView));
}

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

那 BeginInvoke 究竟有什么用呢?

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

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

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

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

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

private void button1_Click_(object sender, System.EventArgs e)
{
  TreeNode tn;
  for(int i=0;i<100000;i++)
  {
    tn=new TreeNode (i.ToString());
    this.treeView1.Nodes[0].Nodes.Add(tn);
    if (i%100 == 0) Application.DoEvents();
  }
}

相關(guān)文章

  • 舉例講解C#中自動實現(xiàn)的屬性

    舉例講解C#中自動實現(xiàn)的屬性

    這篇文章主要介紹了C#中自動實現(xiàn)的屬性,包括使用自動實現(xiàn)的屬性實現(xiàn)輕量類的方法,需要的朋友可以參考下
    2016-01-01
  • C#中拋出異常用法實例

    C#中拋出異常用法實例

    這篇文章主要介紹了C#中拋出異常用法,實例分析了C#使用throw拋出異常的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • C# 創(chuàng)建、部署和調(diào)用WebService簡單示例

    C# 創(chuàng)建、部署和調(diào)用WebService簡單示例

    這篇文章主要為大家詳細介紹了C# 創(chuàng)建、部署和調(diào)用WebService的簡單示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • c#初學簡單程序?qū)嵗a介紹

    c#初學簡單程序?qū)嵗a介紹

    這篇文章介紹了c#初學簡單程序?qū)嵗a,有需要的朋友可以參考一下
    2013-10-10
  • C#生成指定范圍內(nèi)的不重復隨機數(shù)

    C#生成指定范圍內(nèi)的不重復隨機數(shù)

    對于隨機數(shù),大家都知道,計算機不 可能產(chǎn)生完全隨機的數(shù)字,所謂的隨機數(shù)發(fā)生器都是通過一定的算法對事先選定的隨機種子做復雜的運算,用產(chǎn)生的結(jié)果來近似的模擬完全隨機數(shù),這種隨機數(shù)被稱 作偽隨機數(shù)。偽隨機數(shù)是以相同的概率從一組有限的數(shù)字中選取的。
    2015-05-05
  • c#簡單讀取文本的實例方法

    c#簡單讀取文本的實例方法

    c#簡單讀取文本的實例方法,需要的朋友可以參考一下
    2013-04-04
  • C#實現(xiàn)控制Windows系統(tǒng)關(guān)機、重啟和注銷的方法

    C#實現(xiàn)控制Windows系統(tǒng)關(guān)機、重啟和注銷的方法

    這篇文章主要介紹了C#實現(xiàn)控制Windows系統(tǒng)關(guān)機、重啟和注銷的方法,涉及C#調(diào)用windows系統(tǒng)命令實現(xiàn)控制開機、關(guān)機等操作的技巧,非常簡單實用,需要的朋友可以參考下
    2015-04-04
  • C#實現(xiàn)合并多張圖片為GIF動態(tài)圖

    C#實現(xiàn)合并多張圖片為GIF動態(tài)圖

    這篇文章主要為大家詳細介紹了C#如何將把一張又一張的圖片去拼合成一張GIF動態(tài)圖片,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-12-12
  • webBrowser代理設(shè)置c#代碼

    webBrowser代理設(shè)置c#代碼

    本文將介紹C# 為webBrowser設(shè)置代理實現(xiàn)代碼,需要了解的朋友可以參考下
    2012-11-11
  • 訪問修飾符(C# 編程指南)

    訪問修飾符(C# 編程指南)

    所有類型和類型成員都具有可訪問性級別,用來控制是否可以在您程序集的其他代碼中或其他程序集中使用它們。您在聲明類型或成員時使用以下訪問修飾符之一來指定其可訪問性
    2011-02-02

最新評論