当应用程序池仍在运行时,可以/将终止长时间运行的线程

时间:2016-10-17 14:32:42

标签: c# asp.net multithreading iis application-pool

我知道当应用程序池被回收或停止时,或者当进程退出时,我启动的所有线程都将被强制终止。我也知道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时间,时钟时间等无关的线程的任何机制,并根据一些启发式方法终止它们。

1 个答案:

答案 0 :(得分:2)

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

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

我发现在应用程序之外进行基于时间的调度是一种更安全,更简单的模式。每隔5秒让一个cron调用一个秘密URL。