我有三个方法,其中第一个结果将在接下来的两个方法中使用,并且预计不会返回任何数据。
result= await DataAccess.Query(param); //Query
await DataAccess.Create(result);
await DataAccess.Update(result);
我真的需要在这里使用等待吗?
使用async void正确吗在创建和更新功能中?
- 正确的做法是什么一场大火,忘记这里
- 如果我不提async,它会着火吗然后忘记
- 如果异步只用于同步运行?我甚至可以在没有这个关键词的情况下做到这一点
不需要返回任何数据。
错误怎么办?如果发生错误,是否需要返回错误代码,或者即使Create
或Update
失败,200 OK
是否可以接受?
我想你需要一个错误代码。99.99%的电话是这样做的。
我真的需要在这里使用等待吗?
好吧,如果想要同步方法,那么您可以直接调用同步API。我不知道你为什么要那样。
提醒:await
与返回浏览器无关。这一切都与使用更少的线程池线程有关,从而允许您的服务器进一步扩展。
在创建和更新函数中使用async void正确吗?
否。从不
在这里生火并忘记的正确方法是什么?
正确的方法是"不要"。即发即弃很难正确执行,事实上,由于您需要错误代码,因此无法执行即发即弃。
我在博客上写了更多关于即发即弃的内容,包括为什么StartNew
和Task.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();
});
但是,当您不打算从异步方法中获益时,最好覆盖您的方法以同步运行,并使用第一个代码