[英]Task vs async Task
好的,我一直在試圖解決這個問題,我已經閱讀了一些文章,但沒有一篇提供我正在尋找的答案。
我的問題是:為什么Task
必須返回 Task 而async Task
沒有? 例如:
public override Task TokenEndpoint(OAuthTokenEndpointContext context)
{
// Code removed for brevity.
return Task.FromResult<object>(null);
}
正如您在那里看到的,該方法不是async
,因此它必須返回一個 Task。
現在,看看這個:
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
// Code removed for brevity...
if(user == null)
{
context.SetError("invalid_grant", "username_or_password_incorrect");
return;
}
if(!user.EmailConfirmed)
{
context.SetError("invalid_grant", "email_not_confirmed");
return;
}
// Code removed for brevity, no returns down here...
}
它使用async
關鍵字,但不返回任務。 為什么? 我知道這可能是有史以來最愚蠢的問題。 但我想知道為什么會這樣。
async
是編譯器的指示符,表明該方法包含await
。 在這種情況下,您的方法會隱式返回一個 Task,因此您不需要這樣做。
第一種方法不是異步方法。 它返回一個任務,但是當它返回任務時,整個方法無論如何都已經完成了。
第二種方法是異步的。 本質上,您的代碼將同步執行,直到到達await
關鍵字。 一旦這樣做,它將調用async
函數並將控制權返回給調用它的函數。 一旦async
函數返回它的Task
,等待的函數就會從它停止的地方恢復。 還有更多的東西,這是一個相對稀疏的答案。
但是,有關async
關鍵字的MSDN 頁面應該有助於您理解。
異步方法與普通方法不同。 從異步方法返回的任何內容都包含在任務中。 如果沒有返回值(void),它將被包裝在 Task 中,如果您返回 int 它將被包裝在 Task 中,依此類推。 同樣的問題: 異步等待返回任務
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.