IIS CPU在用带线程的Singleton更新C#应用程序中的web.config后执行bezerk操作

本文关键字:web config 操作 bezerk 执行 应用程序 更新 CPU 线程 IIS Singleton | 更新日期: 2023-09-27 18:09:30

我有一个web应用程序,它可以执行以下操作:

单击一个按钮来实例化一个singleton,它将创建一个Thread。该线程持续运行,执行一些HTTP请求以收集一些数据。您可以单击一个停止按钮,该按钮调用线程上的Abort((方法,应用程序就会停止发出HTTP请求。当我手动启动/停止它时,一切都很好。

当我"触摸"web.config时,就会出现问题。CPU(w3wp.exe进程(峰值,网站停止响应。有人知道为什么会发生这种事吗?web.config的更新不应该重置所有内容吗?

示例代码如下:

private static MyProcessor mp = null;
private Thread theThread = null;
private string status = STOP;
public static string STOP = "Stopped";
public static string START = "Started";
private MyProcessor()
{}
public static MyProcessor getInstance()
{
    if (mp == null)
    {
        mp = new MyProcessor();
    }
    return mp;
}
public void Start()
{
    if (this.status == START)
        return;
    this.theThread = new Thread(new ThreadStart(this.StartThread));
    this.theThread.Start();
    this.status = START;
}
public void Stop()
{
    if (this.theThread != null)
        this.theThread.Abort();
    this.status = STOP;
}
private void StartThread()
{
    do
    {
        try
        {
            //do some work with HTTP requests
            Thread.Sleep(1000 * 2);
        }
        catch (Exception e)
        {
            //retry - work forever
            this.StartThread();
        }
    } while (this.status == START);
}

IIS CPU在用带线程的Singleton更新C#应用程序中的web.config后执行bezerk操作

我怀疑这就是问题所在:

private void StartThread()
{
    do
    {
        try
        {
            //do some work with HTTP requests
            Thread.Sleep(1000 * 2);
        }
        catch (Exception e)
        {
            //The recursive call here is suspect
            //at the very least find a way to prevent infinite recursion
            //--or rethink this strategy
            this.StartThread();
        }
    } while (this.status == START);
}

当你的应用程序域重置时,你会得到一个ThreadAbort异常,它将在这里被捕获,并触发一个递归调用,它将命中另一个异常和另一个递归呼叫。一路上都是乌龟!

是的,在web.config中进行任何更改都会重置应用程序,而asp.net则会重新构建应用程序。

其他一些文件也是如此,比如Bin和App_Code文件夹下的文件。