Apppool回收和带有线程的Asp.net?

时间:2011-12-30 16:52:35

标签: asp.net multithreading iis-6

我创建了一个执行long sp的asp.net页面。 假设执行sp的函数叫做Func1

我遇到了这个问题:

如果我在同一个线程中运行Func1(正常执行),apppool将不会自行回收,因为他将其视为忙碌/工作。

但是如果我在另一个线程中执行Func1 - 那么apppool就会在这里设置的时间之后回收:

enter image description here

我的问题是:为什么是这样的?

如果我同时运行同步命令,那么app是否有效且不符合apppool recycle的条件? 如果我在一个新线程中创建它,那么 是否有资格进行apppool recycle?

  

为什么?线程是否比主线程更重要?

1 个答案:

答案 0 :(得分:6)

ASP.NET维护一个用于为请求提供服务的线程池线程列表。它知道它可以在没有任何线程处于活动状态时回收app域。

如果您在不了解ASP.NET的情况下创建线程或使用线程池线程,它将不会检测到您的线程处于活动状态并且可能会回收。

当它循环使用时,它会卸载AppDomain,这会导致在你的线程上抛出ThreadAbortException


您的要求的正常解决方案是拥有由Web应用程序控制的Windows服务。这显然是在一个单独的过程中,因此不受Web应用程序回收的影响。但是,这是一项非常重要的工作。

快速而肮脏的解决方案是从您的Web应用程序中异步启动Web请求。然后可以返回开始操作的页面。调用的“隐藏”页面可以阻止,直到SP完成。正如我所说,这是一个令人讨厌但很容易的解决方案。