亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#利用異步委托實(shí)現(xiàn)獲取線程返回值

 更新時(shí)間:2023年12月13日 09:24:32   作者:rjcql  
一般來說,異步委托主要用于解決 ThreadPool.QueueUserWorkItem 沒有提供獲取線程執(zhí)行完成后的返回值問題,下面我們就來學(xué)習(xí)一下C#如何利用異步委托實(shí)現(xiàn)獲取線程返回值吧

寫在前面

異步委托主要用于解決 ThreadPool.QueueUserWorkItem 沒有提供獲取線程執(zhí)行完成后的返回值問題。異步委托只能在.Net Framework 框架下使用,.Net Core中會(huì)報(bào)平臺(tái)錯(cuò)誤,而且使用Task.Result來獲取返回值,可以達(dá)成同樣的目的;本文純粹是做個(gè)驗(yàn)證試驗(yàn)。

代碼實(shí)現(xiàn)

        static void Main(string[] args)
        {
            AsyncResultTest();
            Console.WriteLine("OK");
            Console.ReadKey();
        }
 
        public static void AsyncResultTest()
        {
            var str = "hello";
            var testOb = new TestOb() { msg = str };
            Func<TestOb, int> testMethod = Dosomething;
            //testMethod.BeginInvoke(testOb, Done, testMethod);
            var asyncResult = testMethod.BeginInvoke(testOb, null, null);
            var task01 = Task.Factory.StartNew(() =>
            {
                Thread.Sleep(1000);
                testOb.msg = "hello world";
                Console.WriteLine($"task01 exceuted str is {testOb.msg}");
            });
            task01.Wait();
            var result = testMethod.EndInvoke(asyncResult);
            Console.WriteLine($"AsyncResultTest finished, result is {result}");
        }
 
        private static int Dosomething(TestOb testOb)
        {
            Console.WriteLine($"Dosomething:{testOb.msg}");
            Thread.Sleep(2000);
            return testOb.msg.Length;
        }
 
        private static void Done(IAsyncResult result)
        {
            var asyncState = (Func<TestOb, int>)result.AsyncState;
            var retVal = asyncState.EndInvoke(result);
            Console.WriteLine($"result is:{retVal}");
        }
 
        class TestOb
        {
            public string msg { get; set; }
        }

執(zhí)行結(jié)果

.Net Core 下實(shí)現(xiàn)類似效果的代碼:

        public static void TaskReturnValueTest()
        {
            var value = "000";
            var task01 = Task.Factory.StartNew(() =>
            {
                value = "111";
                Thread.Sleep(1000);
                Console.WriteLine($"task01 exceuted value is {value}.");
                return "1";
            });
            var task02 = Task.Factory.StartNew(() =>
            {
                Thread.Sleep(800);
                value = "222";
                Console.WriteLine($"task02 exceuted value is {value}.");
                return "2";
            });
            Task.WaitAll(task01, task02);
            var ret01 = task01.Result;
            var ret02 = task02.Result;
            Console.WriteLine($"task01: {ret01}, task02: {ret02}");
            Console.WriteLine("Ok");
        }

執(zhí)行結(jié)果: 

總結(jié) 

用Task類庫(kù)的代碼實(shí)現(xiàn)方式明顯更優(yōu),更易于理解和維護(hù)。

到此這篇關(guān)于C#利用異步委托實(shí)現(xiàn)獲取線程返回值的文章就介紹到這了,更多相關(guān)C#獲取線程返回值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c#在excel中添加超鏈接示例分享

    c#在excel中添加超鏈接示例分享

    c#在excel中添加超鏈接示例分享,大家參考使用吧
    2013-12-12
  • 如何隨機(jī)選取一個(gè)機(jī)器的ip

    如何隨機(jī)選取一個(gè)機(jī)器的ip

    此方法可用于當(dāng)需要負(fù)載均衡時(shí),即想選擇多臺(tái)機(jī)器來處理程序執(zhí)行。 隨機(jī)的選擇一臺(tái)機(jī)器來處理。
    2013-03-03
  • Unity實(shí)現(xiàn)俄羅斯方塊(一)

    Unity實(shí)現(xiàn)俄羅斯方塊(一)

    這篇文章主要介紹了Unity實(shí)現(xiàn)俄羅斯方塊的第一部分代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • C# Socket文件上傳至服務(wù)器的操作方法

    C# Socket文件上傳至服務(wù)器的操作方法

    文件上傳有FTP、WebApi、WebService等等,這次我們來實(shí)現(xiàn)一個(gè)基于socket通信的本地客戶端上傳文件到服務(wù)器的例子,這篇文章主要介紹了C# Socket文件上傳至服務(wù)器的操作方法,需要的朋友可以參考下
    2024-05-05
  • C#中DateTime日期類型格式化顯示方法匯總

    C#中DateTime日期類型格式化顯示方法匯總

    這篇文章主要介紹了C#中DateTime日期類型格式化顯示方法匯總
    2014-07-07
  • C#中的值傳遞和引用傳遞詳細(xì)解析

    C#中的值傳遞和引用傳遞詳細(xì)解析

    本篇文章主要是對(duì)C#中的引用傳遞與值傳遞進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2014-01-01
  • 利用C#實(shí)現(xiàn)AOP常見的幾種方法詳解

    利用C#實(shí)現(xiàn)AOP常見的幾種方法詳解

    AOP面向切面編程(Aspect Oriented Programming),是通過預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。下面這篇文章主要給大家介紹了關(guān)于利用C#實(shí)現(xiàn)AOP常見的幾種方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-09-09
  • C#調(diào)用Oracle存儲(chǔ)過程方法介紹(附源碼)

    C#調(diào)用Oracle存儲(chǔ)過程方法介紹(附源碼)

    這篇文章介紹了C#調(diào)用Oracle存儲(chǔ)過程的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • C#中Kestrel和IIS服務(wù)器下的同步與異步配置

    C#中Kestrel和IIS服務(wù)器下的同步與異步配置

    本篇文章主要講解什么是Kestrel和IIS服務(wù)器和特點(diǎn),以及他們?nèi)绾闻渲猛脚c異步,具有一定的參加價(jià)值,感興趣的可以了解一下
    2023-08-08
  • C#環(huán)形隊(duì)列的實(shí)現(xiàn)方法詳解

    C#環(huán)形隊(duì)列的實(shí)現(xiàn)方法詳解

    這篇文章先是簡(jiǎn)單的給大家介紹了什么是環(huán)形隊(duì)列和環(huán)形隊(duì)列的優(yōu)點(diǎn),然后通過實(shí)例代碼給大家介紹C#如何實(shí)現(xiàn)環(huán)形隊(duì)列,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-09-09

最新評(píng)論