簡體   English   中英

任務與異步任務

[英]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.

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