Asp.Net中Task.Run和QueueBackgroundWorkItem之间的区别

究竟有什么区别

Task.Run(() => { LongRunningMethod(); }); 

要么

 HostingEnvironment.QueueBackgroundWorkItem(clt => LongRunningMethod()); 

我在Asp.Net MVC应用程序上进行了测试,在该应用程序中,我在使用Task.Run或QBWI调用的异步任务中继续在文本文件中写入一行约10分钟。

使用Task和QBWI都可以。 我的异步方法一直写入该文件,直到10分钟没有任何问题。 我没有观察到IIS对其回收的干扰。

那么QueueBackgroundWorkItem有什么特别之处呢?

文档有一个很好的解释:

与普通的ThreadPool工作项不同, ASP.NET可以跟踪通过此API注册的工作项当前正在运行的数量,并且ASP.NET运行时将尝试延迟AppDomain关闭,直到这些工作项完成执行。 无法在ASP.NET管理的AppDomain之外调用此API。 提交的CancellationToken将在应用程序关闭时发出信号。

Task.Factory.StartNew根本不会注册ASP.NET运行时。 你运行你的代码10分钟,没有任何区别。 IIS回收发生在IIS中预设的特定时间。 如果您真的想测试最新情况,可以尝试强制回收 。

下面的文章解释了类似于你正在做的事情,如果你进入最后一节“几乎没有想法……”你会看到两者之间突出的区别

http://codingcanvas.com/using-hostingenvironment-queuebackgroundworkitem-to-run-background-tasks-in-asp-net/

基本上它说使用queuebackgroundworkitem任务是在ASP.Net运行时注册的,如果进程关闭或崩溃,ASP.NET运行时仍然会给进程完成一些宽限期。它还涉及向进程发送通知以便它可以结束并执行任何完成任务,而当您使用Task.Run时,所有这些都不可用

AppDomain关闭只能延迟90秒(实际上是HttpRuntimeSection.ShutdownTimeout和processModel shutdownTimeLimit的最小值)。 如果排队的项目太多而无法在90秒内完成,则ASP.NET运行时将卸载AppDomain而不等待工作项完成。

https://blogs.msdn.microsoft.com/webdev/2014/06/04/queuebackgroundworkitem-to-reliably-schedule-and-run-background-processes-in-asp-net/