У меня есть приложение 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();
}
Спасибо!
Thanks Aristos, свойство «Shutdown Time Limit» в Application Pool было именно тем, что мне нужно было знать. (т. е. процесс прекратится, если он не будет закрыт красиво за это время, 90 секунд в моем случае). Итак, вопрос для вас, действительно ли необходимо, чтобы у меня есть Application_End, до тех пор, пока рабочие рабочие места не очистятся и не закончатся, прежде чем вернуться? Или, могу ли я просто сообщить об этом работникам BEGIN cleanup и вернуть Application_End в этот момент? – eoldre
@eoldre Да, нужно подождать, иначе прекратить потоки. Когда Application_End заканчивается, рабочий пул убит и все потоки исчезнут. То же самое происходит, если вы меняете и обновляете Dll или страницы в Интернете. – Aristos