#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 секунд.