据我了解,
await
关键字会阻止函数继续执行,直到被调用的异步函数完成为止。本质上,它使异步函数变得同步。从而满足以下条件:
await MyAsyncMethod(); // first this is called
await MyOtherAsyncMethod(); // only when the above completes, this is called
MyNonAsyncMethod(); // similarly, this is only called when the above completes
现在在大多数代码编辑器中,省略
await
关键字会导致警告。鉴于我对 async
应该完成的任务的理解,这让我感到困惑。因为如果我们等待每个异步方法,我们不是因此使它们全部同步,从而违背了异步编程的初衷吗?
例如,在我的特定用例中,我有一个功能可以将博客文章保存到数据库,并向所有博客订阅者发送电子邮件以通知他们已创建新帖子。从创建博客文章的用户的角度来看,等待邮件结果是没有意义的。邮件逻辑是一个简单的
for
循环,仅向订阅者发送电子邮件,并且不返回任何值得考虑的信息。用户只关心博文已经创建,并且邮件逻辑已经启动,并且他希望立即收到该信息。因此,我省略了 await
关键字,并允许该过程在后台继续,同时向用户返回一个指示一切正常的值。
public async Task<IActionResult> Create(Blogpost blogpost)
{
try
{
// save to db
await CreateBlogPostAsync(blogpost);
// initiate mailing logic
NotifySubscribersAsync();
return Ok(blogpost);
}
catch
{
// return error code
return StatusCode(500);
}
}
这非常适合我的用例。我不希望用户在收到 OK 信号之前必须等待很长时间才能完成发送过程。我认为这正是异步编程要实现的目标:在函数继续运行的同时允许进程在后台发生。然而,尽管代码可以正常编译并运行以满足我的目的,但 VSCode 警告我应该使用 wait 关键字。
我在这里不明白什么?
那么等待有什么意义呢?异步编程的主要思想是让像 IO 这样的阻塞任务在后台运行,这样就不会阻塞主线程并保持应用程序的特定性。
为什么 Visual Studio Code 告诉您等待函数调用
好吧,因为大多数时候您可能希望任务在后台运行,但函数调用下面的行可能取决于首先完成的函数。
这是函数返回任务时的默认假设。
如果您不想只调用您的函数并且不关心它的返回,请将其返回类型更改为 void。如果您这样做,Visual Studio Code 应该不会打扰您。