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