.NET 비동기 프로그래밍: await Task.Run
및 await Async
방법 선택
.NET 비동기 프로그래밍에서 await Task.Run
및 await
비동기 메서드를 사용하면 혼란스러울 때가 많습니다. 이 기사에서는 구체적인 시나리오를 통해 둘 사이의 차이점을 설명하고 포괄적인 이해를 제공합니다.
장면:
다음 두 코드 조각을 고려하세요.
<code class="language-csharp">await Task.Run(() => LongProcess());</code>
및
<code class="language-csharp">await LongProcess();</code>
여기서 LongProcess
은 await ExecuteReaderAsync()
과 같은 비동기 호출을 포함한 비동기 메서드입니다.
정답:
이 특정 시나리오에서는 두 방법 간에 큰 차이가 없습니다. 둘 다 await
의 비동기 작업이 완료되기 전에 LongProcess
키워드를 사용하여 호출자에게 제어를 반환합니다.
비동기 실행의 본질
일반적인 믿음과는 달리 비동기 코드는 여러 스레드에서 실행되지 않습니다. 대신 "컨텍스트 전환"이라는 기술을 활용하여 스레드에서 실행됩니다.
비동기 함수가 다른 비동기 함수를 호출하면 현재 스레드는 호출자의 실행을 일시적으로 중단하고 호출 수신자의 실행을 계속합니다. 그런 다음 운영 체제는 일시 중단된 스레드를 다른 사용 가능한 작업에 할당합니다.
그러나 호출 수신자에서 await
문이 발견되면 현재 스레드가 호출자에게 반환되어 호출자의 실행을 효과적으로 재개합니다.
직접await
비동기 방식의 장점
주어진 시나리오에서 LongProcess
은 이미 비동기 메서드이므로 await
전에 Task.Run
에 명시적으로 래핑할 필요가 없습니다. 직접 await
비동기 방식을 사용하면 스레드가 LongProcess
이 완료되기를 기다리는 동안 즉시 다른 작업 수행을 시작할 수 있습니다.
Task.Run
사용 시나리오
Task.Run
에는 특정 사용 사례가 있습니다. 예:
요약
주어진 시나리오에서는 두 방법 모두 기능적으로 동일합니다. 그러나 스레드 전환을 줄이고 스레드 풀을 보다 효율적으로 사용할 수 있도록 하는 직접 await
비동기식 접근 방식이 더 좋습니다.
위 내용은 Await Task.Run vs. Await Async: 언제 어느 것을 선택해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!