天天看點

.Net4.0如何實作.NET4.5中的Task.Run及Task.Delay方法

前言

.NET4.0下是沒有Task.Run及Task.Delay方法的,而.NET4.5已經實作,對于還在使用.NET4.0的同學來說,如何在.NET4.0下實作這兩個方法呢?

在.NET4.0下,有一個泛型類,叫TaskCompletionSource<TReuslt>,它能控制Task的行為,如給Task設定結果、設定異常、設定取消等。

MSDN是這樣描述的(網址):

表示未綁定到委托的 Task<TResult> 的制造者方,并通過Task屬性提供對使用者方的通路。

它有以下兩個常用方法:

當執行的任務有異常時,可以使用該方法是設定任務的異常。

這是給任務設定一個傳回值,如果任務沒有傳回值,直接設定null即可。

一、Task.Run(Action action)方法

 該方法實作與Task.Factory.StartNew(Action action)類似,實作代碼如下:

該方法的目的是用來執行委托action所代表的方法,并傳回目前所表示的任務,因方法的簽名傳回值類型為Task,是以需給tcs的SetResult方法設定一個null值。

測試代碼如下:

該代碼的功能是在5s後輸出“Just For Test”字元串到控制台。

注:TaskEx是用來封裝Run靜态方法的一個類,以下内容相同。

二、Task.Run<TResult>(Func<TResult> function)方法

該方法是Task.Run(Action action)的泛型版本,實作如下:

與Task.Run的非泛型版本類似,該方法的目的是用來執行委托function所代表的方法,并傳回目前所表示的任務,該任務類型為Task<TResut>,帶有Task的傳回值。

該方法的功能與上面的例子一樣:在5s後輸出“Just For Test”字元串到控制台,但其實作方式不一樣,一個用的是Action委托,另外一個使用的是Function<TResult>委托。

二、Task.Delay(int milliSeconds)方法

以上代碼功能使用了System.Timers.Timer類來實作任務的延時,用來在milliSeconds毫秒後傳回目前任務,該方法并不會阻塞人任何線程。

該方法的功能還是與前面的兩個一樣,在5s後輸出“Just For Test”字元串到控制台。

完整代碼: