Can/will 一个长 运行 线程被终止,当应用程序池仍然 运行

Can/will a long running thread be terminated, when the app pool is still running

我知道当应用程序池被回收或停止时,或者当进程退出时,我启动的任何线程都会被强制终止。我也知道 IIS 不是为长时间 运行 任务设计或设计的。

考虑 Global.asax

中的以下内容
protected void Application_Start(object sender, EventArgs e)
{
    _worker = new Thread(Run);
    _worker.IsBackground = true;
    _worker.Start();
}

private void Run() 
{
    while(true)
    {
        Thread.Sleep(50000);

        WorkWork.BeHappyTo();
    }
}

鉴于进程和应用程序池没有以任何方式关闭,IIS 中是否有任何其他机制可以终止我的 _worker 线程,但仍继续为新请求提供服务,就好像什么都没有发生了什么?

我正在寻找任何机制来监视与请求、CPU 时间、时钟时间等无关的线程,并根据一些试探法终止它们。

不,只要应用程序域存在,您的线程就是安全的。终止应用程序的随机部分对于 Web 框架来说不是一个好的设计。事实上,没有 .NET API 来枚举所有线程(谢天谢地)。

不过,您需要处理错误,因为错误会终止线程。通常,记录它们并继续是正确的方法。应该查看日志。

我发现在应用程序之外进行基于时间的调度是一种更安全、更容易的模式。每 5 秒进行一次 cron 调用秘密 URL。