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

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在

我在我的端点中进行日志记录,日志被发送到一个单独的服务。我不希望将日志发送到服务的开销影响到客户端正在使用的服务,我也不关心日志是否有时无法完成。因此,我一直在读博客,内容是关于如何简单地开火并忘记。我知道CPU密集型任务不应该使用异步,但我不认为与IO相关的任务有什么不同,我所说的IO是指调用另一个服务的端点,在本例中是为了记录日志

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

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

我很困惑,请有人就向另一个服务发送日志的最佳实践来澄清上述问题

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

提前谢谢

一些博客说,你永远不应该运行任何异步的东西,因为这只是从线程池中获取一个或多个线程

不,那绝对不是真的<代码>异步不使用线程池线程。(有关更多信息,请参阅我的博客文章)

最后,我读到的一些stackoverflow帖子说,可以使用Task.Factory.StartNew,因为.Net将管理它

再说一次,不是真的
StartNew
是一种危险的API,不应以这种方式使用。(有关更多信息,请参阅我的博客文章)

因此,我一直在读博客,内容是关于如何简单地开火并忘记


由于您“不在乎日志是否有时无法完成”,因此我建议使用
HostingEnvironment.QueueBackgroundWorkItem
。QBWI不会防止日志丢失,但会尽最大努力将日志丢失降至最低。仅使用
Task.Run
(或过时且危险的
StartNew
)将工作扔到线程池中,甚至不会尝试最小化日志丢失。Hangfire适用于您需要更健壮的东西的时候-如果您需要正确的日志,例如用于计费或审计。(有关更多信息,请参阅我在上的博客文章)。

首先,给您一点家庭作业:同步IO和异步IO之间的区别是什么?与同步IO相比,使用异步IO有什么优势?IO完成端口(IOCP)在这方面起到什么作用?它们在等待IO时如何释放CPU资源?谢谢。你的答案很清楚,我会准备好你的博客帖子。