2012-02-11 4 views
2

ExecuteRegisteredAsyncTasks 호출에서 반환 된 코드가이 호출 전에 코드와 동일한 스레드에서 실행된다는 사실을 확인했습니다. 따라서 수동으로 ExecuteRegisteredAsyncTasks을 호출해도 다른 요청을 처리하기 위해 요청 처리 스레드가 해제되지 않으며이 메서드는 확장 혜택을 얻기 위해 자동으로 호출되어야한다는 것을 알고 있습니다.ExecuteRegisteredAsyncTasks는 다른 요청을 처리하기 위해 요청 처리 스레드를 해제합니까?

msdn은 예제 코드이지만 도움말에서이 질문에 대답하지 않습니다. 내가 비동기 웹 서비스를 호출하기 때문에 내가 사용하고 있지 않다 스레드 풀 (*를 * 시작 사용 종료)하고 PageAsyncTasks 내 경우

UPDATE

.

답변

4

RegisterAsyncTask 메서드의 MSDN 예제에서 그들은 Begin 및 End 메서드로 호출되는 AsyncTaskDelegate을 단순히 선언합니다. 델리게이트를 비동기 적으로 호출하면 스레드 풀의 스레드가 사용되므로 기본적으로이 경우에는 개선되지 않습니다. 속도 향상은 병렬 작업으로 여러 작업을 동시에 실행하는 경우에만 가능합니다. 그렇지 않으면 동 기적으로 실행됩니다.

실제 성능을 높이려면 IOCP (I/O Completion Ports)를 사용해야합니다. 네트워크 호출 (데이터베이스 호출, 웹 서비스 호출 등)과 같은 I/O 집약적 인 작업에 맞게 조정됩니다. CPU 집약적 인 작업에는 적합하지 않습니다. 이제 WebClient.DownloadStringAsync 메서드를 사용하여 HTTP 호출을 수행한다고 가정 해 봅시다. 이 메서드는 스레드 풀에서 스레드를 사용하지 않습니다. IOCP를 커널에 등록하고 HTTP 요청을 시작합니다. 호출자에게 제어를 반환 할 때 전체 HTTP 요청 기간 동안 스레드가 소비되지 않습니다. 요청이 완료되면 IOCP에 신호가 보내지고 스레드 풀에서 스레드가 추출되어 결과를 처리합니다.

asynchronous pages in ASP.NET 문서를 확인하십시오. IOCP는 더 잘 설명되어 있습니다.

+0

감사합니다. 내 업데이트를 참조하십시오. 방금이 기사를 읽었지만이 질문에 대답하지 않습니다. – Pol

+0

@Pol이므로 비동기 버전의 메소드를 사용하여 웹 서비스를 호출하는 경우 스레드 풀의 스레드를 사용하고 있지 않습니다. 그래서 귀하의 질문에 대답 : 네,이 경우 요청 처리 스레드는 웹 서비스 호출 중에 해제됩니다. –

+0

내 코드에서 직접'ExecuteRegisteredAsyncTasks'를 호출해도 상관 없습니까? 아니면 페이지 처리의 시점에서 자동으로 호출 될까요? 두 경우 모두 요청 처리 스레드는 웹 서비스 호출 중에 해제됩니까? – Pol

관련 문제