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類庫的代碼實(shí)現(xiàn)方式明顯更優(yōu),更易于理解和維護(hù)。
到此這篇關(guān)于C#利用異步委托實(shí)現(xiàn)獲取線程返回值的文章就介紹到這了,更多相關(guān)C#獲取線程返回值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#中標(biāo)準(zhǔn)的IDispose模式代碼詳解
在本篇文章中小編給大家分享的是關(guān)于C#中標(biāo)準(zhǔn)的IDispose模式的實(shí)例用法相關(guān)內(nèi)容,有需要的朋友們測試下。2019-09-09
C#實(shí)現(xiàn)給定字符串生成MD5哈希的方法
這篇文章主要介紹了C#實(shí)現(xiàn)給定字符串生成MD5哈希的方法,涉及C#操作字符串的相關(guān)技巧,需要的朋友可以參考下2015-06-06
如何利用C#正則表達(dá)式判斷是否是有效的文件及文件夾路徑
項(xiàng)目中少不了讀取或設(shè)置文件路徑的功能,如何才能對輸入的路徑是否合法進(jìn)行判斷呢?下面這篇文章主要給大家介紹了關(guān)于C#利用正則表達(dá)式判斷是否是有效的文件及文件夾路徑的相關(guān)資料,需要的朋友可以參考下2022-04-04
c# 如何使用結(jié)構(gòu)體實(shí)現(xiàn)共用體
這篇文章主要介紹了c# 如何使用結(jié)構(gòu)體實(shí)現(xiàn)共用體,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-04-04
C#常用多線程(線程同步,事件觸發(fā),信號量,互斥鎖,共享內(nèi)存,消息隊(duì)列)
這篇文章主要介紹了C#常用多線程(線程同步,事件觸發(fā),信號量,互斥鎖,共享內(nèi)存,消息隊(duì)列),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09

