[英]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.