簡體   English   中英

如果可以編寫我們自己的等待,那么為什么異步方法只能返回Task <T>,Task和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>Taskvoid

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)僅支持TaskTask<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>Taskvoid作為有效的返回類型。 根據C#語言規范 ,聲明如下:

10.15異步功能

異步方法的返回類型必須是void或任務類型。

隨着UWP的推出,您還可以獲得四種內置類型:

  1. IAsyncAction
  2. IAsyncActionWithProgress<TProgress>
  3. IAsyncOperation<TResult>
  4. IAsyncOperationWithProgress<TResult, TProgress>

這些被認為是“異步類型”,您可以按照預期使用asyncawait關鍵字。

更多來自規范:

異步方法的返回類型必須是void或任務類型 任務類型是System.Threading.Tasks.Task和從System.Threading.Tasks.Task<T>構造的類型。 為簡潔起見,在本章中,這些類型分別稱為TaskTask<T> 返回任務類型的異步方法被稱為任務返回。

任務類型的確切定義是實現定義的,但從語言的角度來看,任務類型處於不完整,成功或出現故障的狀態之一。 出現故障的任務會記錄相關的異常。 成功的Task<T>記錄類型T的結果。 任務類型是等待的,因此可以是等待表達式的操作數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM