我有三种方法,第一种结果将在接下来的两种方法中使用,而且没有数据可以返回。
result= await DataAccess.Query(param); //Query
await DataAccess.Create(result);
await DataAccess.Update(result);
我真的需要在这里使用吗?
使用async void是否正确 在创建和更新功能?
答案 0 :(得分:3)
预计没有数据会返回。
错误怎么样?如果发生错误,您是否需要返回错误代码,或者即使200 OK
或Create
失败,Update
是否可以接受?
我假设你需要一个错误代码。 99.99%的电话都可以。
我真的需要在这里使用吗?
好吧,如果您想要同步方法,那么您只需调用同步API即可。我不知道为什么你会这么想。
提醒:await
没有与返回浏览器有关。它与使用更少的线程池线程有关,使您的服务器可以进一步扩展。
在创建和更新函数中使用async void是否正确?
没有。从不。
什么是正确的方法来做火并忘记在这里?
正确的方法是“不要”。 “即发即忘”难以正确执行,事实上,由于您需要错误代码,因此无法执行“即发即弃”。
我写了更多关于“一劳永逸”的内容 - 包括为什么StartNew
和Task.Run
是无效的解决方案 - on my blog。请注意,唯一完全可靠的解决方案(包括升级方案)是最后一个(分布式架构)。
如果async只用于同步运行,那么async的重要性是什么?我甚至可以在没有该关键字的情况下实现这一目标。
它正在串行(按顺序),而不是同步(阻塞线程)。 async
的好处是允许更大的可扩展性。有关详细信息,请参阅我的intro to async
on ASP.NET文章。
答案 1 :(得分:0)
如果需要按特定顺序调用多个方法,但这整套函数可以异步运行,我会这样做:
Task.Run(() =>
{
result = Function();
Create(result);
Update(result);
});
这会将一组功能分成新线程。既然你没有等待这个任务,那就太过火了。
如果您的函数被定义为异步,您可以等待它们完成:
Task.Run(() =>
{
var task = Function();
task.Wait();
var result = task.Result;
Create(result).Wait();
Update(result).Wait();
});
但是当你不打算从异步方法中受益时,最好覆盖你的方法来同步运行并使用第一个代码