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

c#中Invoke與BeginInvoke的用法及說明

 更新時間:2023年01月24日 15:01:00   作者:成長的香蕉  
這篇文章主要介紹了c#中Invoke與BeginInvoke的用法及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

c# Invoke與BeginInvoke

最近在學習線程時,發(fā)現(xiàn)當我創(chuàng)建的線程需要訪問UI界面的時,會發(fā)生異常,原因是我在跨線程調用主線程的控件,因此windows GUI編程有一個規(guī)則,就是只能通過創(chuàng)建控件的線程來操作控件的數(shù)據(jù),否則就可能產(chǎn)生不可預料的結果。

有時候,我們不得不跨線程調用主界面的控件來進行操作,所以為了方便的解決問題,.net為我們提供了Invoke 與beginInvoke

Invoke 與begininvoke區(qū)別在于,invoke會阻塞當前線程,直到invoke調用結束,才會繼續(xù)執(zhí)行下去,而begininvoke 則可以異步進行調用,也就是該方法封送完畢后馬上返回,不會等待委托方法的執(zhí)行結束,調用者線程將不會被阻塞。但是調用者也可以使用EndInvoke方法或者其它類似WaitHandle機制等待異步操作的完成。

先講下Invoke

? ? ? ? // 定義委托函數(shù) ,委托函數(shù)與被委托函數(shù)必須要有相同返回值和參數(shù)列表
? ? ? ? public delegate void myDelegate(string str); ?
? ? ? ? public void _invoke_myDelegate(String str)
? ? ? ? {
? ? ? ? ? ? // invokeRequired 獲取一個bool值 判斷調用控件是否必須要調用invoke方法
? ? ? ? ? ? // 如果調用對象在其他線程,則返回true,否則返回false
? ? ? ? ? ? if (this.InvokeRequired)
? ? ? ? ? ? {
? ? ? ? ? ? ? ?/* Action<string> action = new Action<string>(_invoke_myDelegate);*/
? ? ? ? ? ? ? ?// 確定調用對象在其他線程 則調用invoke函數(shù) 它會返回到擁有這個控件的線程上
? ? ? ? ? ? ? ?// ?利用委托函數(shù),再次調用被委托函數(shù),str為委托函數(shù)的參數(shù)列表
? ? ? ? ? ? ? ?this.Invoke(new myDelegate(_invoke_myDelegate), str);
? ? ? ? ? ? }
? ? ? ? ? ? // 當委托函數(shù)執(zhí)行時, 此時已經(jīng)回到控件線程,可以直接調用控件label
? ? ? ? ? ? label1.Text = str;
? ? ? ? }

這里Invoke 必須等委托函數(shù)調用完成之后,才會執(zhí)行后面操作,那么當我們的委托函數(shù)執(zhí)行的是一個非常耗時的操作

這樣線程就會被阻塞,造成用戶界面卡頓的情況,所以,為了解決invoke同步的問題,還有一種就是beginInvoke

BeginInvoke

BeginInvoke方法觸發(fā)你的異步方法,它和你想要執(zhí)行的異步方法有相同的參數(shù)。

另外還有兩個可選參數(shù)

  • 1.第一個是AsyncCallback委托是異步完成的回調方法。
  • 2.第二個是用戶自定義對象,該對象將傳遞到回調方法中。

BeginInvoke立即返回并且不等待完成異步的調用(繼續(xù)執(zhí)行該下面的代碼,不需要等待)。

BeginInvoke返回IAsyncResult接口,可用于檢測異步調用的過程。

通過EndInvoke方法檢測異步調用的結果。如果異步調用尚未完成,EndInvoke將阻塞調用線程,直到它完成。EndInvoke參數(shù)包括out和ref參數(shù)。

不管怎么么樣,調用了beginInvoke ,就必須調用endInvoke 結束異步,

那我們怎么才能知道什么時候異步結束呢?

常見四種方法:

  • 1.做一些其他操作,然后調用EndInvoke方法阻塞線程直到該方法完成。
  • 2.使用IAsyncResult.AsyncWaitHandle屬性,使用它的WaitOne方法阻塞線程直到收到WaitHandle信號,然后調用EndInvoke。
  • 3.檢查BeginInvoke返回值IAsyncResult的狀態(tài)來決定方法是否完成,然后調用EndInvoke方法。
  • 4.通過在BeginInvoke方法中傳遞該委托,在回調方法中調用該委托的EndInvoke方法。       
? ?AsyncMethodCaller caller = new AsyncMethodCaller(TestMethodAsync); // caller 為委托函數(shù)
? ? ? ? ? ? int threadid = 0;
? ? ? ? ? ? //開啟異步操作
? ? ? ? ? ? IAsyncResult result = caller.BeginInvoke(1000, out threadid, null, null);
? ? ? ? ? ? for (int i = 0; i < 10; i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Console.WriteLine("其它業(yè)務" + i.ToString());
? ? ? ? ? ? }
? ? ? ? ? ? //調用EndInvoke,等待異步執(zhí)行完成
? ? ? ? ? ? Console.WriteLine("等待異步方法TestMethodAsync執(zhí)行完成");
? ? ? ? ? ? //等待異步執(zhí)行完畢信號
? ? ? ? ? ? //result.AsyncWaitHandle.WaitOne();
? ? ? ? ? ? //Console.WriteLine("收到WaitHandle信號");
? ? ? ? ? ? //通過循環(huán)不停的檢查異步運行狀態(tài)
? ? ? ? ? ? while (result.IsCompleted==false)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Thread.Sleep(100);
? ? ? ? ? ? ? ? Console.WriteLine("異步方法,running........");
? ? ? ? ? ? }
? ? ? ? ? ? //異步結束,拿到運行結果
? ? ? ? ? ? string res = caller.EndInvoke(out threadid, result);
? ? ? ? ? ? //顯示關閉句柄
? ? ? ? ? ? result.AsyncWaitHandle.Close();
? ? ? ? ? ? Console.WriteLine("關閉了WaitHandle句柄");

static string TestMethodAsync(int callDuration, out int threadId)
? ? ? ? {
? ? ? ? ? ? Stopwatch sw = new Stopwatch();
? ? ? ? ? ? sw.Start();
? ? ? ? ? ? Console.WriteLine("異步TestMethodAsync開始");
? ? ? ? ? ? for (int i = 0; i < 5; i++)
? ? ? ? ? ? { ? // 模擬耗時操作
? ? ? ? ? ? ? ? Thread.Sleep(callDuration);
? ? ? ? ? ? ? ? Console.WriteLine("TestMethodAsync:" + i.ToString());
? ? ? ? ? ? }
? ? ? ? ? ? sw.Stop();
? ? ? ? ? ? threadId = Thread.CurrentThread.ManagedThreadId;
? ? ? ? ? ? return string.Format("耗時{0}ms.", sw.ElapsedMilliseconds.ToString());
? ? ? ? }

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • c# 爬取優(yōu)酷電影信息(1)

    c# 爬取優(yōu)酷電影信息(1)

    這篇文章主要介紹了c# 如何爬取優(yōu)酷電影信息,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-02-02
  • C#實現(xiàn)多線程下載文件的方法

    C#實現(xiàn)多線程下載文件的方法

    這篇文章主要介紹了C#實現(xiàn)多線程下載文件的方法,實例分析了C#多線程及文件傳輸?shù)南嚓P技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • C#實現(xiàn)自定義ListBox背景的示例詳解

    C#實現(xiàn)自定義ListBox背景的示例詳解

    這篇文章主要為大家詳細介紹了如何利用C#實現(xiàn)自定義ListBox背景,文中的示例代碼講解詳細,對我們學習C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • C#如何讀寫應用程序配置文件App.exe.config,并在界面上顯示

    C#如何讀寫應用程序配置文件App.exe.config,并在界面上顯示

    這篇文章主要介紹了C#如何讀寫應用程序配置文件App.exe.config,并在界面上顯示問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • C#生成EMF矢量圖形文件示例詳解

    C#生成EMF矢量圖形文件示例詳解

    這篇文章主要為大家介紹了C#?生成?EMF矢量圖形文件詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • C#滾動字幕的實現(xiàn)方法

    C#滾動字幕的實現(xiàn)方法

    這篇文章主要介紹了C#滾動字幕的實現(xiàn)方法,主要講述了Graphics.DrawString函數(shù)的應用方法,非常具有實用價值,需要的朋友可以參考下
    2014-10-10
  • c#多進程通訊的實現(xiàn)示例

    c#多進程通訊的實現(xiàn)示例

    本文主要介紹了c#多進程通訊的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • unity使用socket實現(xiàn)聊天室功能

    unity使用socket實現(xiàn)聊天室功能

    這篇文章主要為大家詳細介紹了unity使用socket實現(xiàn)聊天室功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • DevExpress實現(xiàn)TreeList向上遞歸獲取符合條件的父節(jié)點

    DevExpress實現(xiàn)TreeList向上遞歸獲取符合條件的父節(jié)點

    這篇文章主要介紹了DevExpress實現(xiàn)TreeList向上遞歸獲取符合條件的父節(jié)點,需要的朋友可以參考下
    2014-08-08
  • C#語言中字符類char的使用方法(總結)

    C#語言中字符類char的使用方法(總結)

    下面小編就為大家?guī)硪黄狢#語言中字符類char的使用方法(總結)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03

最新評論

浦城县| 宾阳县| 宝丰县| 随州市| 崇阳县| 汤阴县| 赤壁市| 大竹县| 沙田区| 阿拉善盟| 天长市| 凤翔县| 正宁县| 广东省| 安宁市| 重庆市| 英德市| 西乌| 京山县| 南安市| 尚义县| 中宁县| 页游| 康马县| 永川市| 闽清县| 河间市| 新干县| 宣武区| 梅州市| 牙克石市| 和田市| 阿尔山市| 庆安县| 禄丰县| 闸北区| 莱阳市| 西贡区| 高阳县| 邹平县| 东光县|