Web Api C#-Task.Factory.startnew vs async
我在我的端点中进行日志记录,日志被发送到一个单独的服务。我不希望将日志发送到服务的开销影响到客户端正在使用的服务,我也不关心日志是否有时无法完成。因此,我一直在读博客,内容是关于如何简单地开火并忘记。我知道CPU密集型任务不应该使用异步,但我不认为与IO相关的任务有什么不同,我所说的IO是指调用另一个服务的端点,在本例中是为了记录日志 而且,我似乎得到了相互矛盾的观点。一些博客说,你永远不应该运行任何异步的东西,因为这只是从线程池中获取一个或多个线程,因此与同步没有什么不同 Microsoft在.Net 4.5中引入了async和await关键字,他们说您应该在整个端点中使用这些关键字,但这不是仍然使用线程池中的一个或多个线程吗?。最后,我读到的一些stackoverflow帖子说,可以使用Task.Factory.StartNew,因为.Net将管理它 我很困惑,请有人就向另一个服务发送日志的最佳实践来澄清上述问题 我正在考虑使用nlog,因为它具有批处理和异步功能,但我不确定这是否是最好的方法。我不能使用像Hangfire这样的东西,因为我没有sql后端 提前谢谢 一些博客说,你永远不应该运行任何异步的东西,因为这只是从线程池中获取一个或多个线程 不,那绝对不是真的<代码>异步不使用线程池线程。(有关更多信息,请参阅我的博客文章) 最后,我读到的一些stackoverflow帖子说,可以使用Task.Factory.StartNew,因为.Net将管理它 再说一次,不是真的Web Api C#-Task.Factory.startnew vs async,c#,asynchronous,logging,asp.net-web-api,C#,Asynchronous,Logging,Asp.net Web Api,我在我的端点中进行日志记录,日志被发送到一个单独的服务。我不希望将日志发送到服务的开销影响到客户端正在使用的服务,我也不关心日志是否有时无法完成。因此,我一直在读博客,内容是关于如何简单地开火并忘记。我知道CPU密集型任务不应该使用异步,但我不认为与IO相关的任务有什么不同,我所说的IO是指调用另一个服务的端点,在本例中是为了记录日志 而且,我似乎得到了相互矛盾的观点。一些博客说,你永远不应该运行任何异步的东西,因为这只是从线程池中获取一个或多个线程,因此与同步没有什么不同 Microsoft在
StartNew
是一种危险的API,不应以这种方式使用。(有关更多信息,请参阅我的博客文章)
因此,我一直在读博客,内容是关于如何简单地开火并忘记
由于您“不在乎日志是否有时无法完成”,因此我建议使用
HostingEnvironment.QueueBackgroundWorkItem
。QBWI不会防止日志丢失,但会尽最大努力将日志丢失降至最低。仅使用Task.Run
(或过时且危险的StartNew
)将工作扔到线程池中,甚至不会尝试最小化日志丢失。Hangfire适用于您需要更健壮的东西的时候-如果您需要正确的日志,例如用于计费或审计。(有关更多信息,请参阅我在上的博客文章)。首先,给您一点家庭作业:同步IO和异步IO之间的区别是什么?与同步IO相比,使用异步IO有什么优势?IO完成端口(IOCP)在这方面起到什么作用?它们在等待IO时如何释放CPU资源?谢谢。你的答案很清楚,我会准备好你的博客帖子。