IIS CPU выходит из строя после обновления web.config в приложении C # с помощью Singleton с потоком - PullRequest
0 голосов
/ 25 сентября 2011

У меня есть веб-приложение, которое выполняет следующие действия:

Вы нажимаете кнопку, чтобы создать экземпляр синглтона, который создает поток.Этот поток работает непрерывно, выполняя некоторые HTTP-запросы для сбора данных.Вы можете нажать кнопку остановки, которая вызывает метод Abort () в потоке, и приложение перестает делать HTTP-запросы.Когда я запускаю / останавливаю его вручную, все работает нормально.

Моя проблема возникает, когда я "касаюсь" web.config.Процессор (процесс 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);
}

Ответы [ 2 ]

2 голосов
/ 25 сентября 2011

Я подозреваю, что это проблема:

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, которое будет перехвачено здесь, и вызовет рекурсивный вызов, который вызовет другое исключение, иеще один рекурсивный вызов.Это черепахи вниз!

0 голосов
/ 25 сентября 2011

Да, при внесении любых изменений в web .config приложение сбрасывается, и asp.net перестраивает приложение.

То же самое верно для некоторых других файлов, таких как файлы в папках Bin и App_Code.

...