应用程序池回收与Asp.net线程有关吗?

4
我制作了一个执行长时间sp的asp.net页面,假设执行sp的函数名为Func1
我遇到了这个问题:
如果我在同一线程中运行Func1(正常执行),应用程序池将不会重新启动,因为它认为它正在忙碌/工作。
但是,如果我在另一个线程中执行Func1,则应用程序池将在此处设置的时间后自动重新启动:
我的问题是:为什么会这样?
如果我以同步方式运行命令,则应用程序处于活动状态且不符合应用程序池回收的条件吗?如果我在新线程中创建它,那么它就符合应用程序池回收的条件吗?
为什么会这样?线程不如主线程重要吗?

线程将在工作进程内运行,因为所有线程都在其中运行。 - Chris S
@ChrisS 那么为什么当我在线程中运行它时会进行回收,而当我以正常模式运行时不会自动回收呢? - Royi Namir
你想让作业在不必保持网页打开的情况下运行吗?如果是这样,请尝试使用具有超时选项的缓存对象。 - Chris S
1个回答

6

ASP.NET维护一份线程池线程列表,用于处理请求。当没有任何线程处于活动状态时,它知道可以回收应用程序域。

如果您创建一个线程或使用一个线程池线程而不告知ASP.NET,它将无法检测到您的线程正在运行,可能会进行回收。

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


您的需求的正常解决方案是拥有一个由Web应用程序控制的Windows服务。这显然是在一个单独的进程中,因此不受Web应用程序回收的影响。然而,这是一个非微不足道的练习。

快速且简单的解决方案是从您的Web应用程序异步启动一个Web请求。启动操作的页面随后可以返回。被调用的“隐藏”页面可以阻塞,直到SP完成。正如我所说,这是一个不好但简单的解决方案。


1
嗨,谢谢。ASP.NET是否可以告诉IIS:“听着我的朋友,John创建的线程是我的朋友 - 请将其视为线程池中的一个线程...如果他正在运行,请不要回收...把他当作线程池线程来对待。” - Royi Namir
我已经在我的回答中添加了两个可能的解决方案。 - Nick Butler
请确认(第二种解决方案):我创建了一个名为A.aspx的页面,其中包含一个按钮,当按下该按钮时,它会执行AsyncWebRequest到名为B.aspx的页面,在其PageLoad中执行sp。这样,iis将使用线程池处理来自B.aspx的命令,并且不会回收...正确吗?附言:这是否意味着在B.aspx执行时不能关闭A.aspx? - Royi Namir
用户可以关闭他们的浏览器窗口,如果这是你的意思 - 它不会对由Web应用程序本身请求的B.aspx产生任何影响。 - Nick Butler
昨天我想到了另一个解决方案(仍然有点混乱):在A.aspx中放置一个小的1px x 1px的Iframe。当用户按下按钮时,在JS中将Iframe的src设置为B.aspx(在其页面加载时执行Sp)。你对这个想法有什么看法? - Royi Namir
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接