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

时间:2015-04-29 08:40:13

标签: c# .net asp.net-mvc asynchronous task-parallel-library

使用

有什么区别
Task.Run(() => { 
     LongRunningMethod();
});

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

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

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

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

3 个答案:

答案 0 :(得分:33)

documentation有一个很好的解释:

  

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

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

答案 1 :(得分:8)

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

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

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

时,所有这些都不可用

答案 2 :(得分:2)

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/