Может / будет ли завершаться длительный поток, когда пул приложений все еще запущен

#c# #asp.net #multithreading #iis #application-pool

#c# #asp.net #многопоточность #iis #пул приложений

Вопрос:

Я знаю, что любые запущенные мной потоки будут принудительно завершены, когда пул приложений будет переработан или остановлен, или когда процесс завершится. Я также знаю, что 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 поток, но при этом продолжать обслуживать новый запрос, как будто ничего не произошло?

Я ищу любой механизм, который отслеживает потоки, не связанные с запросами, процессорным временем, временем синхронизации и т. Д., И завершает их на основе некоторого набора эвристик.

Ответ №1:

Нет, ваш поток безопасен до тех пор, пока существует домен приложения. Завершение работы случайных частей вашего приложения не будет хорошим дизайном для веб-фреймворка. На самом деле нет .NET API для перечисления всех потоков (слава богу).

Однако вам необходимо обрабатывать ошибки, потому что ошибка приведет к завершению потока. Обычно ведение журнала и продолжение — это правильный подход. Следует просмотреть журналы.

Я считаю, что более безопасным и простым способом планирования на основе времени вне приложения. Заставьте cron вызывать секретный URL-адрес каждые 5 секунд.