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

Fai*_* Mq 39 .net c# asp.net-mvc asynchronous task-parallel-library

究竟有什么区别

Task.Run(() => { 
     LongRunningMethod();
});
Run Code Online (Sandbox Code Playgroud)

要么

HostingEnvironment.QueueBackgroundWorkItem(clt => LongRunningMethod());
Run Code Online (Sandbox Code Playgroud)

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

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

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

Yuv*_*kov 36

文档具有优良的解释:

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

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

  • 强制循环不同于定时循环.强制终结器清除所有内容,无论任何任务,因为它的手册和这样做你试图"重置"一切.我确信新的`QueuedBackgroundWorker`不会通过正常的IIS定时循环再循环,或者它会延迟循环,因为IIS知道某些事情仍在继续. (6认同)
  • 是的,我使用Task和QBWI强制从IIS inetmgr回收,并且两者都立即停止. (2认同)

Jag*_*ags 9

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

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

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


小智 5

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/