我试过在谷歌上搜索这个主题,但我想了解更多信息。
我正试图在ASP.NET应用程序中启动一个新线程,该线程将处理一些需要很长时间的工作。如果我把它放在我的web.config中:
<httpRuntime executionTimeout="5" />
常规请求将在5秒后超时。记住这是为了测试。当我从代码开始一个新线程时:
var testThread = new Thread(new ThreadStart(CustomClass.DoStuffThatTakesLongTime));
testThread.Start();
这个线程将运行超过5秒,这就是我想要的。但是。它将运行多久?假设这个线程需要5小时(仅作为一个示例)。线程什么时候会被杀死?它会一直运行到应用程序池被回收?或者还有什么东西会杀死这个线程?
ASP.NET对您创建的线程一无所知——它将运行,直到AppPool被回收或完成。
然而,由于ASP.Net不知道这个线程,如果服务器认为它应该回收AppPool,它可能会在任何时候突然中止,这不是一件好事!Phil Haack写了一篇关于如何订阅"AppDomainIsGoingDown"活动的博客文章。
关于造成这种情况的原因,我建议阅读Tess Ferrandez的这篇博客文章,但简而言之,它们是:
- 已经安排好了
- Machine.Config、Web.Config或Global.asax已修改
- bin目录或其内容已修改
- 重新编译的次数(aspx、ascx或asax)超过了machine.config或web.config中设置指定的限制(默认情况下设置为15)
- 虚拟目录的物理路径已修改
- CAS策略已修改
- web服务已重新启动
- (仅限2.0)应用程序子目录已删除