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中预设的特定时间.如果您真的想测试最新情况,可以尝试强制回收.
下面的文章解释了类似于你正在做的事情,如果你进入最后一节"几乎没有想法......"你会看到两者之间突出的区别
基本上它说使用queuebackgroundworkitem任务是在ASP.Net运行时注册的,如果进程关闭或崩溃,ASP.NET运行时仍然会给进程完成一些宽限期.它还涉及向进程发送通知以便它可以结束并执行任何完成任务,而当您使用Task.Run时,所有这些都不可用
小智 5
AppDomain 关闭只能延迟 90 秒(实际上是 HttpRuntimeSection.ShutdownTimeout 和 processModel shutdownTimeLimit 中的最小值)。如果排队的项目太多以至于无法在 90 秒内完成,ASP.NET 运行时将卸载 AppDomain,而无需等待工作项目完成。
归档时间: |
|
查看次数: |
19295 次 |
最近记录: |