任务与异步任务

Rot*_*ese 9 .net c# task

好的,我一直在试图解决这个问题,我已经阅读了一些文章,但没有一篇提供我正在寻找的答案。

我的问题是:为什么Task必须返回 Task 而async Task不必返回?例如:

public override Task TokenEndpoint(OAuthTokenEndpointContext context)
{
    // Code removed for brevity.

    return Task.FromResult<object>(null);
}
Run Code Online (Sandbox Code Playgroud)

正如你在那里看到的,那个方法不是async,所以它必须返回一个任务。

现在,看看这个:

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...
}
Run Code Online (Sandbox Code Playgroud)

它使用async关键字,但不返回任务。这是为什么?我知道这可能是有史以来最愚蠢的问题。但我想知道为什么会这样。

nla*_*ker 8

async是编译器指示该方法包含await. 在这种情况下,您的方法会隐式返回一个 Task,因此您不需要这样做。


son*_*hoc 5

第一种方法不是异步方法。它返回一个任务,但是当它返回任务时,整个方法无论如何都已经完成了。

第二种方法是异步的。本质上,您的代码将同步执行,直到遇到await关键字。一旦这样做,它将调用该async函数并将控制权返回给调用它的函数。一旦async函数返回它的Task,等待的函数就会从它停止的地方恢复。还有更多的东西,这是一个相对稀疏的答案。

但是,关键字上的MSDN 页面async应该有助于您的理解。