![](/img/trans.png)
[英]Is it possible to have C# async method return type to be something not Task<T> or void?
[英]If it's possible to write our own awaitables, then why can async methods only return Task<T>, Task and void?
我正在查看MSDN文檔,它說
異步方法有三種可能的返回類型:
Task<TResult>
,Task
和void
。
https://msdn.microsoft.com/en-us/library/mt674893.aspx
但是,我記得在其他地方讀到可以寫作await
自定義await
者。 我怎樣才能調和這兩個事實呢?
await
支持任何類型的“等待”,它們是遵循特定模式的對象實例( GetAwaiter
等)。
async
生成一個狀態機,它只知道如何創建Task
/ Task<T>
awaitables(或返回void
)。
因此,您可以創建自己的自定義等待對象並返回該對象,但您必須明確地執行此操作。 您不能使用async
來執行此操作。
編譯器團隊目前正在考慮向async
添加ValueTask
支持 。 這將允許您使用遵循模式的“異步方法構建器”。 然后你就可以使用async
以及await
操作任何類型的“任務”類型。 不幸的是,它仍然不允許async
方法返回接口類型,但是語言的其他部分的更改是必要的。
.NET附帶的本機類(特別是TaskAwaiter)僅支持Task
, Task<T>
和void
等待,因此這是MSDN告訴您的所有內容。 但是,您可以編寫允許等待其他類型的自定義等待者。
根據https://weblogs.asp.net/dixin/understanding-c-sharp-async-await-2-awaitable-awaiter-pattern ,在以下情況下,對象是等待的:
- 它有一個GetAwaiter()方法(實例方法或擴展方法);
- 它的GetAwaiter()方法返回一個awaiter。 在下列情況下,對象是等待者:
- 它實現了INotifyCompletion或ICriticalNotifyCompletion接口;
- 它有一個IsCompleted,它有一個getter並返回一個布爾值;
- 它有一個GetResult()方法,它返回void或結果。
您提供的鏈接的第一行內容如下:
更新日期:2015年7月20日
所以這有點過時了。 話雖如此,最初的async
方法只有Task<TResult>
, Task
和void
作為有效的返回類型。 根據C#語言規范 ,聲明如下:
10.15異步功能
異步方法的返回類型必須是void或任務類型。
隨着UWP的推出,您還可以獲得四種內置類型:
IAsyncAction
IAsyncActionWithProgress<TProgress>
IAsyncOperation<TResult>
IAsyncOperationWithProgress<TResult, TProgress>
這些被認為是“異步類型”,您可以按照預期使用async
和await
關鍵字。
更多來自規范:
異步方法的返回類型必須是void或任務類型 。 任務類型是
System.Threading.Tasks.Task
和從System.Threading.Tasks.Task<T>
構造的類型。 為簡潔起見,在本章中,這些類型分別稱為Task
和Task<T>
。 返回任務類型的異步方法被稱為任務返回。任務類型的確切定義是實現定義的,但從語言的角度來看,任務類型處於不完整,成功或出現故障的狀態之一。 出現故障的任務會記錄相關的異常。 成功的
Task<T>
記錄類型T
的結果。 任務類型是等待的,因此可以是等待表達式的操作數
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.