任务与异步任务

时间:2018-01-23 00:59:49

标签: c# .net

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

我的问题是:为什么Task必须返回任务而async Task没有? 例如:

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

            return Task.FromResult<object>(null);
        }

正如您所见,该方法不是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...
    }

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

第一种方法不是异步方法。它返回一个任务,但是当它返回任务时,整个方法都会完成。

第二种方法是异步的。从本质上讲,您的代码将同步执行,直到达到await关键字。一旦它发生,它将调用async函数并将控制权返回给调用它的函数。一旦async函数返回其Task,等待的函数将从它停止的位置恢复。除此之外还有更多,这是一个相对稀疏的答案。

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

答案 2 :(得分:0)

异步方法与普通方法不同。从异步方法返回的所有内容都包装在Task中。 如果不返回值(void),则将其包装在Task中;如果返回int,则将其包装在Task中,依此类推。 相同的问题:async await return Task