C#学习教程:C#async / await有/无等待(火灾和忘记)分享


C#async / await有/无等待(火灾和忘记)

我有以下代码:

static async Task Callee() { await Task.Delay(1000); } static async Task Caller() { Callee(); // #1 fire and forget await Callee(); // #2 >1s Task.Run(() => Callee()); // #3 fire and forget await Task.Run(() => Callee()); // #4 >1s Task.Run(async () => await Callee()); // #5 fire and forget await Task.Run(async () => await Callee()); // #6 >1s } static void Main(string[] args) { var stopWatch = new Stopwatch(); stopWatch.Start(); Caller().Wait(); stopWatch.Stop(); Console.WriteLine($"Elapsed: {stopWatch.ElapsedMilliseconds}"); Console.ReadKey(); } 

#1以最简单的方式点燃和忘记。 #2只是等待。 有趣的东西从#3开始。 这些电话背后的深度逻辑是什么?

我知道在ASP.NET中使用fire’n’忘记警告,如此处所指出的那样。 我问这个,因为我们正在将我们的应用程序移动到服务结构,我们不再使用HostingEnvironment.QueueBackgroundWorkItem(async cancellationToken => await LongMethodAsync()); 建议只需用Task.Run替换它。

我看到Task.Run运行一个新线程,那么#3和#5之间会有什么区别呢?

我问这个,因为我们正在将我们的应用程序移动到服务结构,我们不再使用HostingEnvironment.QueueBackgroundWorkItem(async cancellationToken => await LongMethodAsync()); 建议只需用Task.Run替换它。

那是不好的建议。 您应该使用与队列分隔的Web前端的单独后台进程 。

这些电话背后的深度逻辑是什么?

  1. 在当前线程上启动异步方法。 忽略所有结果(包括例外)。
  2. 在当前线程上启动异步方法。 异步等待它完成。 这是调用异步代码的标准方法。
  3. 在线程池线程上启动异步方法。 忽略所有结果(包括例外)。
  4. 在线程池线程上启动异步方法。 异步等待它完成。
  5. 与#3完全相同。
  6. 与#4完全相同。

“26。”火和忘记“很好,只要你永远不会忘记。” 马克西姆26 。

如果你做任何火灾和忘记的情况,你有吞咽exception的巨大风险。 吞下任何例外 – 但特别是致命的例外 – 是exception处理的致命罪。 你最终得到的是内存中的程序,它将产生更难以理解和可重现的exception。 所以不要开始。 这是关于母校的两篇好文章:

http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx http://www.codeproject.com/Articles/9538/Exception-Handling-Best-Practices-in -净

Full on Threads众所周知能够吞咽exception。 事实上,你必须做的工作是不要吞下它们,然后检查它们是否在它们完成后有一个。 您应该至少有一些后续任务可以记录(和可能的暴露)exception。 或者你会真的后悔“火与忘记”。

希望有所帮助。

上述就是C#学习教程:C#async / await有/无等待(火灾和忘记)分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/960080.html

发表评论

邮箱地址不会被公开。 必填项已用*标注