2

내 Understading :ASP.NET 웹 응용 프로그램에서 비동기가 작동하는 방식은 무엇입니까?

비동기 스레딩 다릅니다. 비동기식에서는 단일 스레드를 사용하여 다중 스레드를 실행할 수 있습니다. .Net framework에는 모든 새로운 http 웹 요청에 새 스레드를 할당하는 스레드 풀이 있습니다. 따라서 모든 요청은 단일 스레드에 의해 처리됩니다. 그러나 IIS에는 자체 스레드 풀이 없으므로 CLR의 스레드 풀을 사용합니다.

웹 요청에서 새 추가 스레드를 만들면 스레드 풀에서 하나의 스레드가 손실되고 사이트 트래픽이 많은 경우 사이트 사용자는 스레드가 해제 될 때까지 대기 할 입니다. ASP.Net 앱에서 비동기 작업을 사용하는 것이 좋습니다. 비동기 작업은 기본 웹 요청이 실행되는 단일 스레드에서 실행됩니다.

비동기 작동 방식. 컨트롤러에 두 개의 독립/비동기 작업을 생성한다고 가정합니다 (T1 및 T2라고 가정). T1은 일정한 시간 간격 동안 실행 한 다음 T2를 실행합니다. 그런 다음 다시 메인 웹 요청. 그들은 타임 슬라이싱을 사용하여 CPU를 사용합니다.

Web Request -----> Single Thread Pool Thread (Main Request + T1 +T2) 
    => 
    Execution Lifecycle --> [Main request, T1, T2, T1, Main Request, T2, T1.....] 

우리는 다음 await Task.WhenAll을 사용하는 경우 우리의 주요 스레드는 출시와 풀 스레드 다시 주어 한 번에 모든 작업이 우리가 계속 다시 우리의 스레드를 부여 완료됩니다.

내가 틀린 곳이면 먼저 내 개념을 깨끗하게 정리하십시오. 우리의 스레드가 다음 스레드에 주어진다면

  1. 스레드 WhenAll에 작업에 작동합니다 :

    은 그 때 나는 약간 혼란이있다.

  2. WhenAll이 완료되거나 새로운 스레드가 무작위로 제공되면 동일한 스레드가 다시 발생합니까?
+4

[스레드가 없습니다] (http://blog.stephencleary.com/2013/11/there-is-no-thread.html) –

+0

왜 '스레드'가 신경 쓰입니까? 스레드가 다시 용도가 지정되면 '동일한'스레드가 계산됩니까? 이 점 중 하나는 이러한 세부 사항을 추상화하여 사용자가 신경 쓸 필요가 없도록하는 것입니다. – Milney

+0

ASP 'SynchronizationContext' 구현을 WPF 또는 Winforms 구현과 동일하게 생각하는 것처럼 보입니다. 그것은 완전히 동일하지 않습니다. – Gusdor

답변

9

타임 슬라이싱을 사용하여 CPU를 사용합니다.

여기가 잘못된 것입니다. 스레드은 시간 분할을 통해 CPU를 공유합니다. 작업은 상당히 다릅니다.

작업에는 위임 작업과 약속 작업이라는 두 가지 종류가 있습니다. Delegate Tasks는 스레드에서 실행됩니다. 실제로는 실행할 코드가 있으므로 CPU를 사용해야합니다. 그러나 Delegate Tasks는 비동기 코드에서는 매우 드물며 일반적으로 ASP.NET에서 사용하면 안됩니다.

약속 작업은 대다수의 비동기 코드에서 사용됩니다. 약속 작업은 일종의 "완료"를 나타냅니다. 대다수의 작업에서 그들은 이 아니고 코드를 실행하며 CPU가 필요하지 않습니다. 이것이 가능한 방법에 대한 자세한 내용은 내 블로그 게시물 There Is No Thread을 참조하십시오.

우리 스레드가 스레드 풀에 제공되면 어떤 스레드가 WhenAll에있는 작업에서 작동하는지 확인하십시오.

스레드가 필요하지 않습니다. 이것이 ASP.NET에서 비동기 코드를 사용하는 요점입니다.

WhenAll이 완료되거나 동일한 스레드가 새로운 스레드를 임의로 부여 받으면 같은 스레드가 반환됩니까?

스레드 풀의 스레드로, 시작한 스레드와 같을 수도 있고 그렇지 않을 수도 있습니다. 이러한 이유로 [ThreadStatic] 등을 사용하면 문제가 발생할 것입니다.

비동기 작동 방법에 대한 자세한 내용은 내 async intro과 내 문서 async ASP.NET을 읽는 것이 좋습니다. 두 가지 유형의 작업에 대한 자세한 내용은 내 Task overviewTask status 블로그 게시물을 읽는 것이 좋습니다.

+0

"시작한 것과 동일하지 않을 수도 있습니다.": 맞습니다. 저는 이것을 어려운 방법으로 배웠습니다 : 웹 응용 프로그램에 비동기 처리를 추가했습니다. 그리고 기다린 후에 처리가 계속 될 수 있음을 알게되었습니다. 새로운 스레드. 불행히도 WebOperationContext.Current는 다른 스레드에서 유효하지 않습니다. 또는 .NET 버전 4.6.2에서 수정되기 전에 최소한이 경우였습니다! –

+0

.NET의 동시성을 깊이 이해할 수 있도록 블로그와 책을 읽으겠습니다. 당신은 챔피언입니다 .. 많이 감사합니다 :) –

+0

@Stephen -이 질문에 대답 해주십시오 - https://stackoverflow.com/questions/47239986/queries-regarding-asynchronous-programming-in-asp-net –