Application_End и фоновые процессы, изящно выходящие из приложения ASP.Net - PullRequest
0 голосов
/ 06 января 2011

У меня есть приложение 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 Ответ

1 голос
/ 06 января 2011

Соответствующее время в Application_End

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...