Application_End и фоновые процессы, изящно выходящие из приложения ASP.Net

У меня есть приложение ASP.Net, которое запускает некоторые фоновые рабочие с помощью ThreadPool.QueueUserWorkItem(). Большую часть времени будет работать ноль фоновых потоков, однако возможно, что иногда может быть выполнено до 5-6 одновременно. Кроме того, большинство из них будет завершено в течение пары секунд, но возможно, что они могут работать в течение 10 минут.

Учитывая все различные сценарии, которые могут привести к закрытию приложения ASP.Net, я бы хотел, чтобы эти фоновые процессы завершались корректно, если это возможно, когда приложение должно завершить работу и они находятся в середине обработки.

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

Мои два основных вопроса:

1) Когда будет подходящее время сказать фоновым работникам обернуть вещи. Во время Application_End? Dispose()? Или, возможно, третий вариант, о котором я не знаю.

2) Если я подожду в течение вышеупомянутого события, чтобы процессы завершились перед возвратом, есть ли момент, когда немедленный возврат Application_End мог бы вызвать более серьезные проблемы для приложения, чем приятное завершение фоновых заданий.

void Application_End(object sender, EventArgs e) 
{
    //if this for whatever reason takes a non-trivial time to execute, what problems could I encounter? 
    SignalBackgroundJobsAndWaitForThemToShutDown();
}

Спасибо!

1 ответ

Решение

Подходящее время в Application_End

Теперь, после того, как вы дадите сигнал фоновым заданиям, вы должны дождаться их завершения в этом месте, а затем продолжить, как вам кажется.

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

Также имейте в виду, что если у вас есть пул-сад (более 1 рабочего пула), то Application_End вызывается один раз для каждого пула.

Я использую ту же технику на своих сайтах, так же, как я сигнализирую, что мои потоки останавливаются таким же образом, я просто записываю окончательный конец и проверяю, когда он окончательный, а также заставляю свои процедуры останавливаться и не позволяю им бегать много раз. Application_End вызывается при перезапуске пула либо при открытии файла app_offline.htm, либо при закрытии веб-службы. Лично я отключил повторные циклы, они мне не нужны, и я открываю app_offline.htm, только когда делаю обновления. В этот момент я жду, когда мои потоки пулов прекратят свою работу.

Другие вопросы по тегам