>백엔드 개발 >C++ >Async/Await와 함께 `Task.Run`을 언제 사용해야 합니까?

Async/Await와 함께 `Task.Run`을 언제 사용해야 합니까?

DDD
DDD원래의
2025-01-03 13:42:40739검색

When Should I Use `Task.Run` with Async/Await?

Async/Await 이해: Task.Run을 사용해야 하는 경우

비동기 프로그래밍 영역에서는 비동기 메서드( 비동기) 및 비동기 실행(백그라운드 스레딩). 미묘한 차이를 살펴보기 위해 다음 시나리오를 살펴보겠습니다.

시나리오 1: 백그라운드 스레딩 없음

private async Task DoWork1Async()
{
    int result = 1 + 2;
}

이 예에서 메서드는 비동기로 표시되어 있지만 백그라운드 실행이 필요하지 않은 간단한 작업을 수행합니다. 따라서 기다리는 DoWork1Async()는 동기적으로 실행됩니다.

시나리오 2: 백그라운드 스레드에서 실행

private async Task DoWork2Async()
{
    Task.Run( () =>
    {
        int result = 1 + 2;
    });
}

여기서 메서드는 다시 비동기로 표시되지만, Task.Run에서 실제 작업을 래핑합니다. 이렇게 하면 작업이 백그라운드 스레드에서 실행됩니다. 그러나 백그라운드 스레드 작업이 대기 중이 아니기 때문에 기다리는 DoWork2Async()는 여전히 동기적으로 실행됩니다.

메서드 반환 유형 및 비동기 동작

Async의 반환 유형 메서드는 비동기 동작에도 영향을 미칠 수 있습니다. Task 또는 Task를 반환하는 메서드 기다릴 수 있습니다. 이는 비동기 메서드 내에서 대기를 사용하여 실행을 일시 중지하고 나중에 대기 중인 작업이 완료되면 다시 시작할 수 있음을 의미합니다.

비동기 실행을 위한 Task.Run

메서드를 대기 가능하게 만들고 해당 작업을 백그라운드 스레드에서 실행하려면 Task.Run을 사용하여 새 메서드를 만들어야 합니다. task. 이 접근 방식은 동기 코드와 비동기 코드 간의 명확한 구분을 유지할 수 있기 때문에 Task.Run에서 전체 메서드를 래핑하는 것보다 더 적합합니다.

private Task<int> DoWorkAsync() // No async because the method does not need await
{
  return Task.Run(() =>
  {
    return 1 + 2;
  });
}

모범 사례

  • 백그라운드 스레드 실행을 위해 Task.Run을 사용하세요.
  • 동기 메서드 래핑을 피하세요. 작업.실행; 소비자가 실행 방법을 결정하도록 하세요.
  • 비동기 코드 작성을 위해 선언적 async/await 구문을 수용하세요.
  • 자세한 내용은 비동기에 대한 MSDN 설명서를 참조하세요.

위 내용은 Async/Await와 함께 `Task.Run`을 언제 사용해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.