2011-01-06 1 views
0

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

Учитывая все различные сценарии, которые могут вызвать остановку приложения 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

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

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

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

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

+0

Thanks Aristos, свойство «Shutdown Time Limit» в Application Pool было именно тем, что мне нужно было знать. (т. е. процесс прекратится, если он не будет закрыт красиво за это время, 90 секунд в моем случае). Итак, вопрос для вас, действительно ли необходимо, чтобы у меня есть Application_End, до тех пор, пока рабочие рабочие места не очистятся и не закончатся, прежде чем вернуться? Или, могу ли я просто сообщить об этом работникам BEGIN cleanup и вернуть Application_End в этот момент? – eoldre

+0

@eoldre Да, нужно подождать, иначе прекратить потоки. Когда Application_End заканчивается, рабочий пул убит и все потоки исчезнут. То же самое происходит, если вы меняете и обновляете Dll или страницы в Интернете. – Aristos

 Смежные вопросы

  • Нет связанных вопросов^_^