使用
有什么区别Task.Run(() => {
LongRunningMethod();
});
或
HostingEnvironment.QueueBackgroundWorkItem(clt => LongRunningMethod());
我在Asp.Net MVC应用程序上进行了测试,在该应用程序中,我在使用Task.Run或QBWI调用的异步任务中继续在文本文件中写入行约10分钟。
使用Task和QBWI都很好。我的异步方法一直写入该文件,直到10分钟没有任何问题。我没有看到IIS对其回收的干扰。
那么QueueBackgroundWorkItem有什么特别之处呢?
答案 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)
下面的文章解释了类似于你正在做的事情,如果你进入最后一部分"几乎没有想法......"你看到两者之间突出显示的差异
基本上它说使用queuebackgroundworkitem任务是在ASP.Net运行时注册的,如果进程关闭或崩溃,ASP.NET运行时仍然会给进程完成一些宽限期。它还涉及向进程发送通知以便它可以包装并执行任何完成任务,而当您使用Task.Run
时,所有这些都不可用答案 2 :(得分:2)
AppDomain关闭只能延迟90秒(实际上是HttpRuntimeSection.ShutdownTimeout和processModel shutdownTimeLimit的最小值)。如果排队的项目太多而无法在90秒内完成,则ASP.NET运行时将卸载AppDomain而不等待工作项完成。