繁体   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