好的,我一直试图解决这个问题,我已经阅读了一些文章,但没有一篇能提供我正在寻找的答案。
我的问题是:为什么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
关键字,但不返回任务。这是为什么?
我知道这可能是有史以来最愚蠢的问题。
但我想知道为什么会这样。
答案 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