2010-09-08 4 views
5

프로 시저를 실행할 때 사용자의 네트워크 연결이 몇 초 동안 재설정되는 ASP.NET 웹 응용 프로그램을 유지 관리합니다. 따라서 페이지 요청은 웹 응용 프로그램의 응답을받지 못하기 때문에 사용자의 요청에 따라 시간 초과됩니다 (응답 패킷이 도착하기 전에 연결이 끊어집니다).비동기 기능 웹 응용 프로그램의 Thread.Sleep

이 상황을 해결하기 위해 ASP.NET 페이지가 Thread.Sleep(5000); // sleep for 5 seconds before executing the connection reset을 포함하는 비동기 함수를 실행하도록 계획했습니다.이 방법으로 브라우저는 연결이 재설정되기 전에 페이지의 응답을받는 데 5 초가 걸립니다.

ASP.NET에서 Thread.Sleep 및 비동기 함수를 사용하는 데 대한 우려가 있습니다. 이전에는 시도한 적이 없으므로 잠재적 인 문제가 발생할 수 있는지 확신 할 수 없습니다. ASP.NET 응용 프로그램에서 Thread.Sleep이 포함 된 비동기 스레드를 시작하면 잠재적 인 문제가 발생할 수 있습니까? 그렇다면 더 나은 해결책을 생각할 수 있습니까?

답변

3

스레드를 비동기식으로 배치하면 ThreadPool Starvation에 영향을 줄 수 있습니다. ThreadPool Starvation은 몇 초 동안 제한된 수의 스레드 중 하나를 차단하므로 스레드가 클라이언트 요청을 처리하지 못할 수 있습니다.

대신 5 초 후에 발생하는 타이머를 만들면 어떻습니까? 동일한 효과, 지연된 작업을 타이머 이벤트에 등록하십시오.

+0

타이머가 참조 된 개체 (이 경우 페이지)가 파괴 되더라도 타이머가 계속 실행됩니까? – regex

+1

이것을 참조하는 페이지가 가비지 수집 된 경우 타이머도 활성화되므로 실행되지 않습니다. 강력한 참조를 유지하려면 만료되지 않은 타이머의 정적 콜렉션을 유지해야합니다. – FacticiusVir

+0

좋은 점 - 모든 스레드가 잠자고 스레드가 다시 깨어나기를 기다리는 동안 응용 프로그램이 대기 상태에 있으면 ThreadPool이 자주 중단 될 수 있습니다. – SqlRyan

1

문제 설명이 너무 모호하여 적절하게 해결할 수는 없지만 Sleep 문 대신 System.Threading.Timer를 사용해야한다고 말할 수 있습니다. 전자는 성능이 좋으며 후자는 CPU 코어 중 하나를 바쁜 상태로 유지합니다 (매우 나쁨).

+1

이것은 매우 정확하지 않습니다. 잠자기중인 스레드는 차단됨으로 표시되어 CPU 시간을 소비하지 않습니다. 그러나 아무 이유없이 스레드를 차단하고 있으며 * 나쁜 *입니다. – FacticiusVir

+0

연결 재설정을 수행하는 방법에 관계없이 클라이언트의 시간 초과가 발생하는 것 같습니다. ASP.NET 스레드가 두 개의 비동기 이벤트에서 대기하는 경우 잠금 (Monitor.Pulse/Monitor.Wait)을 사용하지 않는 것이 좋습니다. 비즈니스 프로 시저를 비동기로 만들고 System.Threading.Timer를 사용합니다. 프로 시저와 타이머 모두 펄스를 호출합니다. 타이머가 성공하면 "tookTooLong"플래그가 설정되고 ASP.NET 호출이 클라이언트에 정상적으로 반환 될 수 있습니다. 프로 시저가 성공하면 "tookTooLong"플래그가 지워집니다. 당신은 아이디어를 얻습니다. –

+0

@FacticiusVir : 필자가 보았던 "sleep"로 채워진 여러 응용 프로그램의 경우 CPU 사용량을 100 %에서 2 %로 줄이려면 sleep 문을 제거해야했습니다. –

1

스레드가 제한되어 있기 때문에 일반적으로 웹 서버에서 스레드를 절전 모드로 전환하는 것은 좋지 않습니다. 특정 경우에는 모든 스레드를 차단하기 위해 초당 ~ 1-2 요청을 시작하는 클라이언트가 필요합니다 ...

다른 제안 사항과 같이 타이머를 사용해야하며 AsyncPage/AsyncHttpHandler을 사용해야합니다.

관련 문제