91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C# Invoke和BeginInvoke之間的區別是什么

發布時間:2020-09-09 11:06:59 來源:億速云 閱讀:182 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關 C# Invoke和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();
   }
}

關于 C# Invoke和BeginInvoke之間的區別是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

定结县| 正宁县| 遂昌县| 平南县| 孟津县| 锡林浩特市| 蓬莱市| 合肥市| 冷水江市| 阜阳市| 伊通| 绍兴县| 兴义市| 文安县| 嘉善县| 金溪县| 拉萨市| 南郑县| 新泰市| 泗水县| 恩施市| 武宣县| 石棉县| 安西县| 曲周县| 满洲里市| 莒南县| 桐城市| 濉溪县| 无极县| 贵定县| 六安市| 吴忠市| 开化县| 府谷县| 浙江省| 同仁县| 瓦房店市| 玉树县| 白城市| 昌黎县|