[英]Creating an async method in .NET 4.0 that can be used with “await” in .NET 4.5
我有一個在.NET 4.0和VS2010中使用C#的.NET項目。
我想做的是為我的庫添加一些異步重載,以便使用await關鍵字為.NET 4.5中的用戶更容易地執行異步編程。 現在,正在重載的方法是非異步的。 此外,我不想自己使用任何異步方法,只需創建新方法並使其可用。
是否可以在.NET 4.0和VS2010中創建異步方法,如果是這樣,.NET 4.0異步方法應該是什么樣的?
因為我正在使用VS2010,所以我無法訪問“async”關鍵字,因此需要在.NET 4.0中模擬這種行為? 例如,它是否需要返回任何特定類型,並且是否需要在方法內部發生任何代碼以使其調用的當前非異步代碼異步發生?
正如其他人所說,你首先要有一個方法返回Task
或Task<TResult>
。 這足以await
.NET 4.5中的結果。
要使您的方法盡可能適應未來的異步代碼,請遵循基於任務的異步模式文檔 (也可在MSDN上獲得 )中的指導原則。 它提供命名約定和參數建議,例如,用於支持取消。
為了實現您的方法,您有以下幾種選擇:
IAsyncResult
的異步方法,請使用Task.Factory.FromAsync
。 TaskCompletionSource<TResult>
。 最簡單的方法是返回Task
或Task<T>
。 那就足夠了。
但是,這只有在您的方法真正異步執行時才有意義。
我還建議您遵循通常的命名模式,如AbcAsync(“Async”后綴)。 您的調用者不會注意到使用C#5創建的異步方法有任何差異(因為沒有)。
提示:只需在方法中添加異步即可。 您的方法將按順序執行並返回已完成的任務。 使方法返回任務必須服務於某個目的 - 通常這樣做是因為該方法本身是異步執行的(如Web服務調用或文件IO)。
如果你的方法只包含計算但沒有IO(或者只是阻塞IO),那么通常最好不要使它異步,因為你沒有做到這一點。 異步方法並不總是在單獨的線程上執行。 如果最后一句話讓你感到驚訝,你可能想要深入研究一下這個話題。
只要您返回以某種方式完成的任務(無論是在線程中還是異步地),您都將支持異步模型。
讓異步執行任務是另一回事。 如果您可以訪問async關鍵字和API,則只需將方法基於對其他已提供的異步方法的異步調用。 但在這種情況下,您必須手工制作異步任務。
可能有更好的方法來實現它,但我能看到(並且已經使用過)最優雅的方法是利用System.Threading.Tasks.TaskCompletionSource
來構造任務,使用異步方法的Begin
/ End
模型來執行你需要的任何東西執行。 然后,當您掌握結果時,使用完成源將其發布到先前構造的Task
實例。
它肯定是異步的,只是不像即將發布的版本那樣花哨。
免責聲明:我沒有辦法接近專家。 剛做了一些實驗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.