程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中Invoke 和 BeginInvoke 的真正涵義

C#中Invoke 和 BeginInvoke 的真正涵義

編輯:C#入門知識

C#中Invoke 和 BeginInvoke 的真正涵義。本站提示廣大學習愛好者:(C#中Invoke 和 BeginInvoke 的真正涵義)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中Invoke 和 BeginInvoke 的真正涵義正文


BeginInvoke 辦法真的是新開一個線程停止異步驟用嗎?

參考以下代碼:

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));
}

看看運轉成果,彈出的對話框中顯示的是 UIThread,這解釋 BeginInvoke 所挪用的拜托基本就是在 UI 線程中履行的。

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

我們再看看上面的代碼:

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));
}

再看看運轉成果,彈出的對話框中顯示的照樣 UIThread,這解釋甚麼?這解釋 BeginInvoke 辦法所挪用的拜托不管若何都是在 UI 線程中履行的。

那 BeginInvoke 畢竟有甚麼用呢?

在多線程編程中,我們常常要在任務線程中去更新界面顯示,而在多線程中直接挪用界面控件的辦法是毛病的做法,詳細的緣由可以在看完我的這篇以後看看這篇:在多線程中若何挪用Winform,假如你是年夜牛的話就不要看我這篇了,直接看那篇吧,橫豎那篇文章我沒怎樣看懂。

Invoke 和 BeginInvoke 就是為懂得決這個成績而湧現的,使你在多線程中平安的更新界面顯示。

准確的做法是將任務線程中觸及更新界面的代碼封裝為一個辦法,經由過程 Invoke 或許 BeginInvoke 去挪用,二者的差別就是一個招致任務線程期待,而別的一個則不會。

而所謂的“一面呼應操作,一面添加節點”永久只能是絕對的,使 UI 線程的累贅不至於太年夜而以,由於界面的准確更新一直要經由過程 UI 線程去做,我們要做的工作是在任務線程中包辦年夜部門的運算,而將對純潔的界面更新放到 UI 線程中去做,如許也就到達了加重 UI 線程累贅的目標了。

而在那段更新樹節點的代碼中,其實獨一起感化的代碼是:System.Threading.Thread.Sleep(100);,它使 UI 線程有了處置界面新聞的機遇,其實 數碼鬼魂 將成績龐雜化了,只需以下的代碼便可以很好的任務了。

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();
  }
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved