没有异步空虚的火与忘记

时间:2017-01-17 11:37:44

标签: c# asp.net .net

我有三种方法,第一种结果将在接下来的两种方法中使用,而且没有数据可以返回。

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

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

  3. 什么是正确的做法         火了,忘记了吗?
  4. 如果我没有提到异步会发生火灾             忘了?
  5. 如果没有等待,async的意义是什么             只用于同步运行?如果没有那个关键字,我甚至可以做到这一点。

2 个答案:

答案 0 :(得分:3)

  

预计没有数据会返回。

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

我假设你需要一个错误代码。 99.99%的电话都可以。

  

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

好吧,如果您想要同步方法,那么您只需调用同步API即可。我不知道为什么你会这么想。

提醒:await 没有与返回浏览器有关。它与使用更少的线程池线程有关,使您的服务器可以进一步扩展。

  

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

没有。从不。

  

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

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

我写了更多关于“一劳永逸”的内容 - 包括为什么StartNewTask.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();
});

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