日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

(转)C# Delegate.Invoke、Delegate.BeginInvoke

發(fā)布時間:2025/7/14 C# 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (转)C# Delegate.Invoke、Delegate.BeginInvoke 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Delegate的Invoke、BeginInvoke

1、Delegate.Invoke (委托同步調(diào)用)

  a、委托的Invoke方法,在當前線程中執(zhí)行委托。

  b、委托執(zhí)行時阻塞當前線程,知道委托執(zhí)行完畢,當前線程才繼續(xù)向下執(zhí)行。

  c、委托的Invoke方法,類似方法的常規(guī)調(diào)用。

2、Delegate.BeginInvoke (委托異步調(diào)用)

  a、委托的BeginInvoke方法,在線程池分配的子線程中執(zhí)行委托

  b、委托執(zhí)行時不會阻塞主線程(調(diào)用委托的BeginInvoke線程),主線程繼續(xù)向下執(zhí)行。

  c、委托執(zhí)行時會阻塞子線程。

  d、委托結(jié)束時,如果有返回值,子線程講返回值傳遞給主線程;如果有回調(diào)函數(shù),子線程將繼續(xù)執(zhí)行回調(diào)函數(shù)。

3、Demo

  a、Delegate

1 private void btn_General_Click(object sender, EventArgs e)2 {3 txt_Message.Text = "";4 txt_Message.Text += "主線程:"+ Thread.CurrentThread.ManagedThreadId + "---開始工作\r\n";5 //委托方法,在調(diào)用委托的線程中執(zhí)行,本例中就是主線程(UI線程)。6 //執(zhí)行一些耗時的操作,就會阻塞主線程(UI線程)7 //委托的普通調(diào)用就等于方法的直接調(diào)用,del();等價于SomeWork();8 del();9 //SomeWork(); 10 txt_Message.Text += "\r\n主線程:" + Thread.CurrentThread.ManagedThreadId + "---開始結(jié)束\r\n"; 11 }

   b、Delegate.Invoke

1 private void btn_Main_Invoke_Click(object sender, EventArgs e) 2 { 3 txt_Message.Text = ""; 4 txt_Message.Text += "主線程:" + Thread.CurrentThread.ManagedThreadId + "---開始工作\r\n"; 5 //委托的同步調(diào)用,其實就是等價于委托的普通調(diào)用。 6 del.Invoke(); 7 txt_Message.Text += "\r\n主線程:" + Thread.CurrentThread.ManagedThreadId + "---開始結(jié)束\r\n"; 8 } 1 private void btn_Sub_Invoke_Click(object sender, EventArgs e)2 {3 txt_Message.Text = "";4 txt_Message.Text += "主線程:" + Thread.CurrentThread.ManagedThreadId + "---開始工作\r\n";5 6 //開啟新的線程執(zhí)行委托,主線程(UI線程)繼續(xù)向下執(zhí)行7 new Thread(() => {8 txt_Message.Text += "\r\n----子線程:" + Thread.CurrentThread.ManagedThreadId + "---開始工作\r\n";9 //委托在調(diào)用線程中執(zhí)行,并阻塞調(diào)用線程,知道委托方法執(zhí)行結(jié)束。 10 del.Invoke(); 11 txt_Message.Text += "\r\n----子線程:" + Thread.CurrentThread.ManagedThreadId + "---開始結(jié)束\r\n"; 12 }).Start(); 13 14 txt_Message.Text += "\r\n主線程:" + Thread.CurrentThread.ManagedThreadId + "---開始結(jié)束\r\n"; 15 }

  c、Delegate.BeginInvoke

1 private void btn_Main_BeginInvoke_Click(object sender, EventArgs e)2 {3 txt_Message.Text = "";4 txt_Message.Text += "主線程:" + Thread.CurrentThread.ManagedThreadId + "---開始工作\r\n";5 //委托異步調(diào)用6 //1、委托方法,在線程池中分配的子線程中執(zhí)行。7 //2、主線程和子線程同時執(zhí)行。8 //3、子線程結(jié)束之后,如果有返回值得話,將返回值傳遞給主線程。如果有回調(diào)函數(shù)的話,繼續(xù)在子線程中執(zhí)行回調(diào)函數(shù)。9 10 //有異常,控件不能在子線程中訪問修改。 11 //避免這類異常有兩種方法 12 //1、手動關(guān)閉控件的跨線程安全檢查Control.CheckForIllegalCrossThreadCalls = false;(不建議使用) 13 //2、使用控件的Invoke方法。(推薦使用) 14 del.BeginInvoke(null,null); 15 txt_Message.Text += "\r\n主線程:" + Thread.CurrentThread.ManagedThreadId + "---開始結(jié)束\r\n"; 16 } 1 private void btn_Sub_BeginInvoke_Click(object sender, EventArgs e)2 {3 txt_Message.Text = "";4 txt_Message.Text += "主線程:" + Thread.CurrentThread.ManagedThreadId + "---開始工作\r\n";5 6 //開啟新的線程執(zhí)行委托,主線程(UI線程)繼續(xù)向下執(zhí)行7 new Thread(() =>8 {9 txt_Message.Text += "\r\n----子線程:" + Thread.CurrentThread.ManagedThreadId + "---開始工作\r\n"; 10 //在線程池中分配的子線程中執(zhí)行委托方法,調(diào)用委托的線程繼續(xù)向下執(zhí)行。 11 del.BeginInvoke(null, null); 12 txt_Message.Text += "\r\n----子線程:" + Thread.CurrentThread.ManagedThreadId + "---開始結(jié)束\r\n"; 13 }).Start(); 14 15 txt_Message.Text += "\r\n主線程:" + Thread.CurrentThread.ManagedThreadId + "---開始結(jié)束\r\n"; 16 }

  文章轉(zhuǎn)載自:https://www.cnblogs.com/EasonLeung/p/3683492.html

轉(zhuǎn)載于:https://www.cnblogs.com/yeshenmeng/p/9482620.html

總結(jié)

以上是生活随笔為你收集整理的(转)C# Delegate.Invoke、Delegate.BeginInvoke的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。