的区别到底是什么?
Task.Run(() => {
LongRunningMethod();
});或
HostingEnvironment.QueueBackgroundWorkItem(clt => LongRunningMethod());我在一个QBWI应用程序上进行了测试,在这个应用程序中,我在使用Task.Run或Asp.Net调用的异步任务中持续向文本文件写入一行代码,持续了大约10分钟。
使用Task和QBWI都很好。我的异步方法继续写入该文件,直到10分钟没有任何问题。关于它的回收,我观察到没有来自IIS的干扰。
那么QueueBackgroundWorkItem有什么特别之处呢?
发布于 2015-04-29 16:42:08
documentation有一个很好的解释:
与普通ThreadPool工作项的不同之处在于,ASP.NET可以跟踪通过此ASP.NET注册的工作项当前正在运行的数量,并且ASP.NET运行时将尝试延迟AppDomain关闭,直到这些工作项完成执行。不能在ASP.Net托管的AppDomain外部调用此API。当应用程序关闭时,将用信号通知提供的CancellationToken。
Task.Factory.StartNew根本不会向ASP.NET运行时注册工作。你运行你的代码10分钟,这是没有区别的。IIS回收发生在特定的时间,即preset in IIS。如果你真的想测试到底是怎么回事,你可以尝试force a recycle。
发布于 2015-07-15 14:26:53
下面的文章解释了一些类似于你正在做的事情,如果你进入最后一节“几个更多的想法……”您可以看到这两者之间的区别
基本上,它说使用队列背景工作项任务是在ASP.Net运行时中注册的,如果进程关闭或崩溃,ASP.NET运行时仍然会为complete.It的进程提供一些宽限期,还包括向进程发送通知,以便它可以完成和执行任何完成任务,而当您使用Task.Run时,所有这些都不可用
发布于 2017-04-18 03:57:33
AppDomain关闭只能延迟90秒(实际上这是HttpRuntimeSection.ShutdownTimeout和processModel shutdownTimeLimit的最小值)。如果您有太多排队的项目,以至于它们不能在90秒内完成,那么ASP.NET运行时将卸载AppDomain,而不等待工作项目完成。
https://stackoverflow.com/questions/29938522
复制相似问题