Web Api C# - Task.Factory.startnew vs async

本文关键字:startnew vs async Factory Task Api Web | 更新日期: 2023-09-27 18:05:29

我在端点内做日志记录,日志被发送到一个单独的服务。我不希望将日志发送到服务的开销影响到客户端正在使用的服务,我也不关心日志有时是否会出错。因此,我一直在阅读一些关于如何简单地放弃的博客。我知道CPU密集型任务不应该使用异步,但我看不出与IO相关的任务有什么不同,IO是指调用另一个服务的端点,在这种情况下是为了记录日志。

而且我似乎得到了相互矛盾的观点。一些博客说你不应该运行任何异步的东西,因为这只是从线程池中获取一个或多个线程,因此它和同步没有什么不同。

微软在。net 4.5中引入了async和await关键字,他们说你应该在整个端点上使用它们,但这不是仍然使用线程池中的一个或多个线程吗?最后,我读过的一些stackoverflow帖子说,使用Task.Factory.StartNew是可以的,因为。net会管理它。

有人可以澄清上述的最佳实践发送日志到另一个服务,因为我很困惑。

我正在考虑使用nlog,因为它的批处理和异步功能,但我不确定这是否是最好的方式。我不能使用像Hangfire这样的东西,因为我没有sql后端。

Web Api C# - Task.Factory.startnew vs async

一些博客说你不应该运行任何异步操作,因为这只会从线程池中获取一个或多个线程

不,那绝对不是真的。async不使用线程池线程。(欲了解更多信息,请参阅我的博客文章There Is No Thread)。

最后一些我读过的stackoverflow帖子说使用Task.Factory.StartNew是可以的,因为。net会管理它。

又错了。StartNew是一个危险的API,不应该这样使用。(欲了解更多信息,请参阅我的博客文章StartNew是危险的)。

因此,我一直在看一些关于如何简单地忘记的博客。

既然你"不在乎日志有时不做",那么我建议使用HostingEnvironment.QueueBackgroundWorkItem。QBWI不会防止日志丢失,但它会尽最大努力最小化日志丢失。仅仅使用Task.Run(或过时且危险的StartNew)将工作扔到线程池中,甚至不会尝试以最小化日志损失。Hangfire适用于当你需要更健壮的东西时——如果你要求你的日志是正确的,例如,用于计费或审计。(有关更多信息,请参阅我的博客文章Fire and Forget on ASP.NET)。