【问题标题】:When will ASP.NET kill a new thread?ASP.NET 什么时候会杀死一个新线程?
【发布时间】:2023-03-19 01:00:01
【问题描述】:

我已经尝试在这个主题上进行一些谷歌搜索,但我想了解更多信息。

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

<httpRuntime executionTimeout="5" />

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

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

这个线程将运行超过 5 秒,这就是我想要的。但。它将运行多长时间?假设这个线程需要 5h(仅作为示例)。线程什么时候会被杀死?它会一直运行到应用程序池被回收吗?或者还有什么东西可以杀死这个线程?

【问题讨论】:

  • 试一试,看看会发生什么。 (让新线程将时间写入文本文件左右)编辑:检查使用线程和任务之间是否有区别。
  • 那是我想要的,但我想要更了解一些。线程接缝要运行,但我想了解更多关于可能出现的问题以及要查找的内容。

标签: asp.net multithreading timeout


【解决方案1】:

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

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

关于可能导致此问题的原因,我建议阅读此blog post by Tess Ferrandez,但简而言之,它们是:

  • 计划这样做
  • Machine.Config、Web.Config 或 Global.asax 已修改
  • bin 目录或其内容被修改
  • 重新编译的次数(aspx、ascx 或 asax)超过 machine.config 或 web.config 中的设置指定的限制(默认设置为 15)
  • 修改了虚拟目录的物理路径
  • CAS 政策已修改
  • Web 服务已重新启动
  • (仅限 2.0)应用程序子目录被删除

【讨论】:

  • 这意味着这个“示例”线程将运行 5 小时。当线程完成时,GC 会处理一些事情还是我需要以任何方式释放资源?
  • @MarkusKnappenJohansson 线程将一直运行,直到它完成或 AppPool 被关闭。在 Thread 的生命周期内获取的所有资源都被管理,所有必要的 GC 仍然会执行。
  • 所以。关于线程可能被服务器中止的事实。如果线程实际上正在处理某些东西,会发生这种情况吗?或者只是如果它空闲?有什么方法可以“保护”免受这种情况吗?
  • @MarkusKnappenJohansson 是的,无论线程是在工作还是空闲,它都可能被中止。为了通知 ASP.Net 您的线程正在工作,您需要在工作的相关生命周期内实现 IRegisteredObject 并调用 HostingEnvironment.RegisterObject 和 UnregisterObject 方法。我强烈建议您阅读 Phil Haack 的博客文章 - 它准确地描述了您在这里想要实现的目标。
  • @MarkusKnappenJohansson 我已经更新了我的答案,希望这能提供您正在寻找的信息。如果不是,请告诉我,我会看看是否可以提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-11
  • 1970-01-01
相关资源
最近更新 更多