C# 비동기 프로그래밍: await Task.Run
과 await
C# 비동기 프로그래밍에서 await Task.Run
과 await
의 사용은 혼동되는 경우가 많으며, 특히 둘 사이의 차이가 명확하지 않은 경우에는 더욱 그렇습니다. 코드 실행을 최적화하고 잠재적인 문제를 피하려면 차이점을 이해하는 것이 중요합니다.
비동기 프로그래밍의 기초
특정 시나리오를 살펴보기 전에 비동기 프로그래밍의 기본 사항을 간략하게 살펴보겠습니다. C#의 비동기 메서드는 비차단 실행을 허용하므로 UI 스레드를 차단하지 않고 작업을 병렬로 수행할 수 있습니다.
비동기 메서드가 호출되면 실행을 제어하는 상태 머신이 형성됩니다. 메소드에서 await
키워드가 발견되면 비동기 작업이 백그라운드에서 계속되는 동안 호출자에게 제어권이 전달됩니다. 작업이 완료된 후 상태 머신은 await
에서 실행을 재개합니다.
await Task.Run
대 await
특정 시나리오에서는 await Task.Run(() => LongProcess())
과 await LongProcess()
가 동일한 표현처럼 보일 수도 있지만 그 이면에는 미묘한 차이가 있습니다.
await Task.Run(() => LongProcess())
은 LongProcess
메서드를 실행하기 위해 백그라운드 스레드를 시작하여 현재 스레드를 해제하여 다른 작업을 수행합니다. 백그라운드 작업이 완료된 후 스레드는 호출자에게 반환되어 실행을 계속합니다.
반면 await LongProcess()
는 LongProcess
메서드 자체가 비동기 메서드라는 의미입니다. 이 경우 현재 스레드는 백그라운드 스레드에 제어권을 부여하지 않습니다. 대신 LongProcess
에 대해 비동기 상태 기계가 형성되고 await
키워드를 사용하면 LongProcess
의 비동기 작업이 완료된 후에도 상태 기계가 계속 실행될 수 있습니다.
스레드 동작의 영향
await Task.Run
과 await
의 차이점은 스레드 동작에 영향을 미칩니다.
await Task.Run
: 비동기 작업을 수행하기 위한 백그라운드 스레드를 만듭니다. 백그라운드 작업이 실행되는 동안 다른 스레드는 계속 실행될 수 있습니다. await
: 현재 스레드가 일시 중지되고 비동기 메서드에서 비동기 작업이 진행되는 동안 다른 스레드가 실행될 수 있습니다. 언제 어떤 방법을 사용해야 하는지
대부분의 경우 LongProcess
가 이미 비동기 방식인 경우 await LongProcess()
대신 await Task.Run(() => LongProcess())
을 사용하는 것이 좋습니다. 이는 LongProcess
의 비동기 작업이 실행되는 동안 현재 스레드의 응답성을 유지합니다.
그러나 LongProcess
이 비동기 메서드가 아니거나 UI 스레드를 차단할 정도로 매우 큰 계산을 수행하는 경우 await Task.Run(() => LongProcess())
를 사용하여 실행을 백그라운드 스레드에 위임하는 것이 좋습니다.
위 내용은 작업 대기.실행 및 대기: 비동기 프로그래밍에서 각 접근 방식을 언제 사용해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!