最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中Invoke 和 BeginInvoke 的真正涵義

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

BeginInvoke 方法真的是新開一個(gè)線程進(jìn)行異步調(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));
}

看看運(yùn)行結(jié)果,彈出的對(duì)話框中顯示的是 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));
}

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

那 BeginInvoke 究竟有什么用呢?

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

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

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

而所謂的“一面響應(yīng)操作,一面添加節(jié)點(diǎn)”永遠(yuǎn)只能是相對(duì)的,使 UI 線程的負(fù)擔(dān)不至于太大而以,因?yàn)榻缑娴恼_更新始終要通過 UI 線程去做,我們要做的事情是在工作線程中包攬大部分的運(yùn)算,而將對(duì)純粹的界面更新放到 UI 線程中去做,這樣也就達(dá)到了減輕 UI 線程負(fù)擔(dān)的目的了。

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

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)文章

  • 關(guān)于C#基礎(chǔ)知識(shí)回顧--反射(二)

    關(guān)于C#基礎(chǔ)知識(shí)回顧--反射(二)

    其實(shí)說白了,反射就是能知道我們未知類型的類型信息這么一個(gè)東西.沒什么神秘可講!反射的核心是System.Type。System.Type包含了很多屬性和方法,使用這些屬性和方法可以在運(yùn)行時(shí)得到類型信息
    2013-07-07
  • C#下使用XmlDocument操作XML詳解

    C#下使用XmlDocument操作XML詳解

    本文詳細(xì)講解了C#使用XmlDocument操作XML的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • C#?Sqlite數(shù)據(jù)庫的搭建及使用技巧

    C#?Sqlite數(shù)據(jù)庫的搭建及使用技巧

    這篇文章主要介紹了C#?Sqlite數(shù)據(jù)庫的搭建及使用技巧,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-08-08
  • 最新評(píng)論

    潮州市| 双流县| 徐州市| 内黄县| 株洲市| 永定县| 海丰县| 武陟县| 全椒县| 信宜市| 开封县| 察隅县| 固安县| 绵竹市| 临汾市| 游戏| 额敏县| 息烽县| 沅江市| 融水| 长白| 青田县| 三江| 剑河县| 襄垣县| 奈曼旗| 东莞市| 通许县| 东兰县| 马鞍山市| 河源市| 林西县| 泌阳县| 开远市| 巍山| 东乌珠穆沁旗| 尼玛县| 武义县| 上高县| 保亭| 甘洛县|