C#利用異步委托實現(xiàn)獲取線程返回值
寫在前面
異步委托主要用于解決 ThreadPool.QueueUserWorkItem 沒有提供獲取線程執(zhí)行完成后的返回值問題。異步委托只能在.Net Framework 框架下使用,.Net Core中會報平臺錯誤,而且使用Task.Result來獲取返回值,可以達(dá)成同樣的目的;本文純粹是做個驗證試驗。
代碼實現(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 下實現(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類庫的代碼實現(xiàn)方式明顯更優(yōu),更易于理解和維護(hù)。
到此這篇關(guān)于C#利用異步委托實現(xiàn)獲取線程返回值的文章就介紹到這了,更多相關(guān)C#獲取線程返回值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#中Kestrel和IIS服務(wù)器下的同步與異步配置
本篇文章主要講解什么是Kestrel和IIS服務(wù)器和特點,以及他們?nèi)绾闻渲猛脚c異步,具有一定的參加價值,感興趣的可以了解一下2023-08-08