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#調(diào)用Oracle存儲(chǔ)過程方法介紹(附源碼)
這篇文章介紹了C#調(diào)用Oracle存儲(chǔ)過程的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03C#中Kestrel和IIS服務(wù)器下的同步與異步配置
本篇文章主要講解什么是Kestrel和IIS服務(wù)器和特點(diǎn),以及他們?nèi)绾闻渲猛脚c異步,具有一定的參加價(jià)值,感興趣的可以了解一下2023-08-08C#環(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