如何提取 Thread 中返回值?

咨詢區(qū)
Asad
如何獲取 Thread 中的返回值?
回答區(qū)
Igor Bendrup:
關(guān)于如何獲取?Thread?中的返回值,不同的版本有不同的解決方案。
.NET 2.0+
你可以直接使用 Thread 對(duì)象,然后你可以使用閉包(聲明變量并在 lambda 中捕獲它),參考如下代碼:
object?result?=?null;
Thread?thread?=?new?System.Threading.Thread(()?=>?{?
????//Some?work...
????result?=?42;?});
thread.Start();
thread.Join();
Console.WriteLine(result);
也可以使用?IAsyncResult?然后在?EndInvoke()?方法中獲取返回值。
delegate?object?MyFunc();
...
MyFunc?x?=?new?MyFunc(()?=>?{?
????//Some?work...
????return?42;?});
IAsyncResult?asyncResult?=?x.BeginInvoke(null,?null);
object?result?=?x.EndInvoke(asyncResult);
還可以使用傳統(tǒng)的?BackgroundWorker,然后在 RunWorkerCompleted ?事件中捕獲。
BackgroundWorker?worker?=?new?BackgroundWorker();
worker.DoWork?+=?(s,?e)?=>?{
????//Some?work...
????e.Result?=?42;
};
worker.RunWorkerCompleted?+=?(s,?e)?=>?{
????//e.Result?"returned"?from?thread
????Console.WriteLine(e.Result);
};
worker.RunWorkerAsync();
.NET 4.0 +
從?.NET 4.0?開始,你可以通過 Task 的方式開啟 Thread,如果想獲取返回值可以提取?Task?中的 Result,參考如下代碼:
//Main?thread?will?be?blocked?until?task?thread?finishes
//(because?of?obtaining?the?value?of?the?Result?property)
int?result?=?Task.Factory.StartNew(()?=>?{
????//Some?work...
????return?42;}).Result;
.NET 4.5 +
從?.NET 4.5?開始, 你可以使用?await,async?的方式替代 Task 的 Result 屬性,參考如下代碼:
int?result?=?await?Task.Run(()?=>?{
????//Some?work...
????return?42;?});
我個(gè)人建議,最好用 Task 來替代傳統(tǒng) Thread 所做的事情。
點(diǎn)評(píng)區(qū)
Igor Bendrup?大佬列出了?7-8?種如何獲取線程的返回值太全了,學(xué)習(xí)了。
【推薦】.NET Core開發(fā)實(shí)戰(zhàn)視頻課程?★★★
.NET Core實(shí)戰(zhàn)項(xiàng)目之CMS 第一章 入門篇-開篇及總體規(guī)劃
【.NET Core微服務(wù)實(shí)戰(zhàn)-統(tǒng)一身份認(rèn)證】開篇及目錄索引
Redis基本使用及百億數(shù)據(jù)量中的使用技巧分享(附視頻地址及觀看指南)
.NET Core中的一個(gè)接口多種實(shí)現(xiàn)的依賴注入與動(dòng)態(tài)選擇看這篇就夠了
10個(gè)小技巧助您寫出高性能的ASP.NET Core代碼
用abp vNext快速開發(fā)Quartz.NET定時(shí)任務(wù)管理界面
在ASP.NET Core中創(chuàng)建基于Quartz.NET托管服務(wù)輕松實(shí)現(xiàn)作業(yè)調(diào)度
現(xiàn)身說法:實(shí)際業(yè)務(wù)出發(fā)分析百億數(shù)據(jù)量下的多表查詢優(yōu)化
