激发并忘记没有异步无效



我有三个方法,其中第一个结果将在接下来的两个方法中使用,并且预计不会返回任何数据。

result= await DataAccess.Query(param); //Query 
await DataAccess.Create(result);
await DataAccess.Update(result);
  1. 我真的需要在这里使用等待吗?

  2. 使用async void正确吗在创建和更新功能中?

  3. 正确的做法是什么一场大火,忘记这里
  4. 如果我不提async,它会着火吗然后忘记
  5. 如果异步只用于同步运行?我甚至可以在没有这个关键词的情况下做到这一点

不需要返回任何数据。

错误怎么办?如果发生错误,是否需要返回错误代码,或者即使CreateUpdate失败,200 OK是否可以接受?

我想你需要一个错误代码。99.99%的电话是这样做的。

我真的需要在这里使用等待吗?

好吧,如果想要同步方法,那么您可以直接调用同步API。我不知道你为什么要那样。

提醒:await与返回浏览器无关。这一切都与使用更少的线程池线程有关,从而允许您的服务器进一步扩展。

在创建和更新函数中使用async void正确吗?

否。从不

在这里生火并忘记的正确方法是什么?

正确的方法是"不要"。即发即弃很难正确执行,事实上,由于您需要错误代码,因此无法执行即发即弃。

我在博客上写了更多关于即发即弃的内容,包括为什么StartNewTask.Run是无效的解决方案。请注意,唯一完全可靠的解决方案(包括升级场景)是最后一个解决方案(分布式体系结构)。

如果异步只用于同步运行,那么没有等待的异步有什么意义?我甚至可以在没有这个关键词的情况下做到这一点。

它是串行运行(按顺序),而不是同步运行(阻塞线程)。async的好处是允许更大的可扩展性。有关更多信息,请参阅我对ASP上async的介绍。NET文章。

如果你需要按特定顺序调用几个方法,但这整套函数可以异步运行,我会这样做:

Task.Run(() =>
{
result = Function();
Create(result);
Update(result);
});

这将把一组函数分离到新的线程中。既然你没有在等待这项任务,那就太容易忘记了。

如果你的函数被定义为async,你可以等待它们像这样完成:

Task.Run(() =>
{
var task = Function();
task.Wait();
var result = task.Result;
Create(result).Wait();
Update(result).Wait();
});

但是,当您不打算从异步方法中获益时,最好覆盖您的方法以同步运行,并使用第一个代码

最新更新