2011-12-30 27 views
3

我已经做了一个asp.net页面,执行一个很长的sp。 可以说执行sp的函数被称为Func1Apppool回收和Asp.net与线程?

香港专业教育学院会见了这个问题:

如果我跑在同一个线程(正常执行)Func1,因为他看到它作为一个忙/工作程序池不会回收本身。

但是,如果我在另一个线程执行Func1 - 这样的应用程序池回收的本身的时间后,它被设置在这里:

enter image description here

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

是真的,如果我同步运行一个命令,这样的应用程序是活动的,不符合apppool回收利用? 如果我在一个新线程中创建它,那么确实符合应用程序池回收的条件吗?

这是为什么?线程是否比主线程不那么重要?

+0

线程将工作进程内运行的内运行的所有线程 – 2011-12-30 16:55:12

+0

@ChrisS那么,为什么他是回收,当我在一个线程中运行它,当我在正常模式下运行它 - 它不会回收本身? – 2011-12-30 16:58:50

+0

您是否希望工作不需要保持网页打开状态?如果是这样,请尝试使用缓存的对象与超时选项 – 2011-12-30 17:05:27

回答

4

ASP.NET认为它正在使用的服务请求线程池中的线程的列表。它知道它可以在没有线程处于活动状态时回收应用程序域。

如果你创建一个线程或使用线程池线程没有ASP.NET的知识,就不会检测到您的线程是活动的,可以回收利用。

当它回收时,它会卸载AppDomain,导致ThreadAbortException在您的线程上抛出。


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

快速和肮脏的解决方案是异步开始从你的web应用程序内的Web请求。然后可以返回开始操作的页面。被调用的“隐藏”页面可能会阻塞,直到SP完成。正如我所说的那样,这是一个令人讨厌但简单的解决方案。

+1

感谢嗨,有没有可能是asp.net会告诉IIS:**听我的朋友,约翰创建线程是我的朋友 - 请把它当作的一个线程池线程...并且不回收,如果他正在运行...把他当作线程池线程** – 2011-12-30 17:06:11

+0

我已经为我的答案添加了两种可能的解决方案。 – 2011-12-30 17:09:45

+0

请确认(第二种解决方案):我创建了A.aspx,它有一个按钮,当它按下时,它执行AsyncWebRequest到页面B.aspx,在他的pageLoad中执行sp。这样,iis会用线程池处理来自B.aspx的命令 - 它不会回收...正确的? p.s是否意味着在B.aspx执行时不应该关闭A.aspx? – 2011-12-30 17:22:33