2012-01-10 45 views
9

我已经尝试了一些谷歌搜索这个问题,但我想有更多的信息。ASP.NET何时会杀死一个新线程?

我正在尝试在ASP.NET应用程序中启动一个新线程,该应用程序将照顾需要很长时间的一些工作。如果我把它放在我的web.config中:

<httpRuntime executionTimeout="5" /> 

一个普通的请求会在5秒后超时。记住这是为了测试。当我从代码开始一个新的线程:

var testThread = new Thread(new ThreadStart(CustomClass.DoStuffThatTakesLongTime)); 
    testThread.Start(); 

此线程将运行超过5秒,这就是我想要的。但。它会运行多久?假设这个线程需要5小时(就像一个例子)。线程何时会被杀死?它会运行,直到应用程序池被回收?或者还有什么可以杀死这个线程?

+0

试一试,看看会发生什么。 (让新线程将时间写入文本文件左右) 编辑:检查是否有使用线程和任务之间的差异。 – ZippyV 2012-01-10 14:58:17

+0

这就是我想要的,但我想要更多的了解。线缝运行,但我想知道更多关于什么可能出错和要查找什么。 – 2012-01-10 15:00:30

回答

9

ASP.NET不知道你创建的线程 - 它会运行,直到AppPool被回收或完成。

由于ASP.Net不知道这个线程,但它可以可以如果服务器认为它应该回收AppPool任何时候都会突然中止,这不会是一件好事! Phil Haack wrote a blog post关于如何订阅'AppDomainIsGoingDown'事件。

在关于是什么导致这个问题,我建议你阅读这blog post by Tess Ferrandez,但简而言之,他们是:

  • 已计划这样做
  • Machine.config并网.Config或Global.asax被修改
  • 修改bin目录或其内容
  • 重新编译数(aspx,ascx或asax)超过machine.config或web.config中的设置指定的限制(默认情况下这是设置为15)
  • 被修改的虚拟目录的物理路径
  • 的CAS策略被修改
  • web服务被重新启动
  • (仅2.0)应用子目录被删除
+0

所以这意味着这个“exemple”线程将运行5小时。当线程完成或者我需要以任何方式释放资源时,GC会处理这些东西吗? – 2012-01-10 14:52:55

+1

@MarkusKnappenJohansson线程将一直运行,直到完成或AppPool关闭。在线程生命周期中获取的所有资源都将被管理,所有必要的GC仍将被执行。 – 2012-01-10 14:55:09

+0

所以。关于线程可能被服务器中止的事实。会发生这种情况是线程实际上在处理什么?或者只是闲置?有什么办法可以“保护”这个吗? – 2012-01-10 14:57:31