ThreadPool.QueueUserWorkItem()을 사용하여 일부 백그라운드 작업자를 시작하는 ASP.Net 응용 프로그램이 있습니다. 대부분의 경우 백그라운드 스레드가 실행되지 않을 수 있지만 한 번에 최대 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();
}
고마워요!
감사의 말 Aristos, 응용 프로그램 풀의 "종료 시간 제한"속성은 내가 알아야 할 필요가있는 것입니다. (즉, 프로세스가 그 시간 내에 종료되지 않으면 프로세스가 종료됩니다. 제 경우에는 90 초입니다). 그래서 당신을 위해 후속 질문, 실제로 내가 작업자 작업을 정리하고 반환하기 전에 끝날 때까지 Application_End 기다려야 할 필요가 있습니까? 아니면 BEGIN 정리 작업에 신호를 보내서 그 시점에서 Application_End를 반환 할 수 있습니까? – eoldre
@eoldre 예, 기다릴 필요가 있습니다. 그렇지 않으면 스레드를 종료합니다. Application_End가 끝나면 작업 풀이 종료되고 모든 스레드가 사라집니다. Dll이나 웹 페이지를 변경하고 업데이트하면 같은 생각이납니다. – Aristos