여기에 다른 답변은 가장 중요한 점을 생략 한 것 같습니다.
부하가 적은 사이트에서 더 빠르게 수행하기 위해 CPU 집약적 인 작업을 병렬화하려고하지 않는 한 작업자 스레드를 사용할 필요가 없습니다.
에 의해 생성 된 사용 가능한 스레드 new Thread(...)
와 요청에 ThreadPool
응답하는 의 작업자 스레드 모두에 적용 QueueUserWorkItem
됩니다.
예, 사실 입니다. 너무 많은 작업 항목을 대기열에 추가하여 ASP.NET 프로세스에서 굶주릴 수ThreadPool
있습니다. ASP.NET이 추가 요청을 처리하지 못하게합니다. 기사의 정보는 그 점에서 정확합니다. QueueUserWorkItem
요청을 처리하는 데에도 사용 되는 동일한 스레드 풀이 사용됩니다 .
그러나 실제로 이러한 기아를 유발할 수있는 충분한 작업 항목을 큐에 넣는 경우 스레드 풀이 부족 해야 합니다! 말 그대로 수백 개의 CPU 집약적 작업을 동시에 실행하는 경우 컴퓨터가 이미 과부하 상태 일 때 ASP.NET 요청을 처리 할 다른 작업자 스레드가 있으면 어떤 이점이 있습니까? 이런 상황에 처해 있다면 완전히 재 설계해야합니다!
대부분의 경우 멀티 스레드 코드가 ASP.NET에서 부적절하게 사용되는 것을 보거나 듣습니다. CPU 집약적 인 작업을 대기열에 넣는 것이 아닙니다. I / O 바운드 작업을 큐잉하기위한 것입니다. 그리고 당신은 내가에게 / O 작업을 수행하려는 경우, 당신은 I / O 스레드 (I / O 완료 포트)를 이용해야한다.
특히, 사용중인 라이브러리 클래스에서 지원하는 비동기 콜백을 사용해야합니다. 이러한 방법은 항상 매우 명확하게 표시되어 있습니다. 단어 Begin
와 End
. 마찬가지로 Stream.BeginRead
, Socket.BeginConnect
, WebRequest.BeginGetResponse
, 등.
이러한 방법은 할 를 사용 ThreadPool
하지만, 그들은 않습니다 IOCPs 사용 하지 ASP.NET 요청을 방해합니다. I / O 시스템의 인터럽트 신호에 의해 "깨어날"수있는 특수한 종류의 경량 스레드입니다. 그리고 ASP.NET 응용 프로그램에서는 일반적으로 각 작업자 스레드에 대해 하나의 I / O 스레드가 있으므로 모든 단일 요청에 하나의 비동기 작업이 대기 될 수 있습니다. 이는 상당한 성능 저하없이 말 그대로 수백 개의 비동기 작업입니다 (I / O 하위 시스템이이를 따라갈 수 있다고 가정). 여러분이 필요로하는 것보다 훨씬 더 많습니다.
비동기 델리게이트 는 이런 방식으로 작동하지 않는다는 점을 명심하십시오. .NET 과 마찬가지로 작업자 스레드를 사용하게 ThreadPool.QueueUserWorkItem
됩니다. 이 작업을 수행 할 수있는 것은 .NET Framework 라이브러리 클래스의 기본 제공 비동기 메서드뿐입니다. 직접 할 수 있지만 복잡하고 약간 위험하며 아마도이 논의의 범위를 벗어납니다.
이 질문에 대한 가장 좋은 대답 은 ASP.NET에서 또는 백그라운드 인스턴스를 사용하지 않는 것ThreadPool
Thread
입니다. Windows Forms 응용 프로그램에서 스레드를 회전시키는 것과는 전혀 다릅니다. UI의 응답 성을 유지하고 얼마나 효율적인지 신경 쓰지 않습니다. ASP.NET에서 관심사는 처리량 이며 모든 작업자 스레드에서 전환되는 모든 컨텍스트는 사용 여부에 관계없이 처리량 을 절대적으로 죽일 것 ThreadPool
입니다.
ASP.NET에서 스레딩 코드를 작성하는 경우-기존 비동기 메서드를 사용하도록 다시 작성할 수 있는지 여부를 고려하고 그렇지 않은 경우 실제로 코드가 필요한지 여부를 고려하십시오. 백그라운드 스레드에서 실행됩니다. 대부분의 경우 순이익이없이 복잡성을 추가 할 수 있습니다.