首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Asp.Net中Task.Run与QueueBackgroundWorkItem的区别

问Asp.Net中Task.Run与QueueBackgroundWorkItem的区别
EN

Stack Overflow用户
提问于 2015-04-29 16:40:13
回答 3查看 25.7K关注 0票数 47

的区别到底是什么?

代码语言:javascript
复制
Task.Run(() => { 
     LongRunningMethod();
});

或

代码语言:javascript
复制
HostingEnvironment.QueueBackgroundWorkItem(clt => LongRunningMethod());

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

使用Task和QBWI都很好。我的异步方法继续写入该文件,直到10分钟没有任何问题。关于它的回收,我观察到没有来自IIS的干扰。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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。

票数 44
EN

Stack Overflow用户

发布于 2015-07-15 14:26:53

下面的文章解释了一些类似于你正在做的事情,如果你进入最后一节“几个更多的想法……”您可以看到这两者之间的区别

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

基本上,它说使用队列背景工作项任务是在ASP.Net运行时中注册的,如果进程关闭或崩溃,ASP.NET运行时仍然会为complete.It的进程提供一些宽限期,还包括向进程发送通知,以便它可以完成和执行任何完成任务,而当您使用Task.Run时,所有这些都不可用

票数 11
EN

Stack Overflow用户

发布于 2017-04-18 03:57:33

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/

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29938522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档