任务 vs 异步任务

19

好的,我一直在试图弄清楚这个问题,我已经阅读了一些文章,但其中没有一个提供我想要的答案。

我的问题是:为什么 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关键字,但它没有返回一个Task。为什么会这样呢?我知道这可能是最愚蠢的问题,但我想知道为什么会这样。

3个回答

13

async 是编译器的指示,表示该方法包含一个 await。在这种情况下,你的方法会隐式地返回一个 Task,因此你不需要手动返回。


9
第一种方法不是异步方法。它返回一个任务,但在返回任务时,整个方法已经完成了。
第二种方法是异步的。基本上,您的代码将同步执行,直到它达到一个await关键字。一旦它这样做,它将调用async函数并将控制权返回给调用它的函数。一旦async函数返回其Task,等待的函数就会恢复到离开的地方。除此之外还有更多内容,这只是一个相对简略的答案。
然而,MSDN页面关于async关键字应该有助于您的理解。

0

异步方法与普通方法不同。从异步方法返回的任何内容都被包装在Task中。 如果您返回无值(void),它将被包装在Task中,如果您返回int,它将被包装在Task中,以此类推。 同样的问题:async await return Task


我在 MSDN 文章中找不到这个语句;能否有人请粘贴官方文档的参考链接? - gawkface

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接