异步函数中什么时候可以省略await?

问题描述 投票:0回答:1

据我了解,

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 关键字。

我在这里不明白什么?

c# .net async-await
1个回答
0
投票

那么等待有什么意义呢?异步编程的主要思想是让像 IO 这样的阻塞任务在后台运行,这样就不会阻塞主线程并保持应用程序的特定性。

为什么 Visual Studio Code 告诉您等待函数调用

好吧,因为大多数时候您可能希望任务在后台运行,但函数调用下面的行可能取决于首先完成的函数。

这是函数返回任务时的默认假设。

如果您不想只调用您的函数并且不关心它的返回,请将其返回类型更改为 void。如果您这样做,Visual Studio Code 应该不会打扰您。

© www.soinside.com 2019 - 2024. All rights reserved.