IT TIP

새로운 C # 5.0 'async'및 'await'키워드가 다중 코어를 사용합니까?

itqueen 2020. 12. 2. 22:24
반응형

새로운 C # 5.0 'async'및 'await'키워드가 다중 코어를 사용합니까?


C # 5.0 언어에 추가 된 두 개의 새로운 키워드는 asyncawait 이며, 둘 다 호출 스레드를 차단하지 않고 비동기 적으로 C # 메서드를 실행하기 위해 함께 작동합니다.

내 질문은 이러한 메서드가 실제로 여러 코어를 활용하고 병렬로 실행됩니까 아니면 비동기 메서드가 호출자와 동일한 스레드 코어에서 실행됩니까?


C # 5.0 언어에 추가 된 두 개의 새로운 키워드는 async 및 await이며, 둘 다 호출 스레드를 차단하지 않고 비동기 적으로 C # 메서드를 실행하기 위해 함께 작동합니다.

이는 기능 목적 을 넘어서지 만 async / await 기능에 너무 많은 "크레딧"을 제공합니다.

이 점에 대해 매우 명확하게 설명하겠습니다 await. 동기 메서드가 비동기 적으로 실행되도록 마술처럼 유발하지 않습니다. 예를 들어, 새 스레드를 시작하지 않고 새 스레드에서 메소드를 실행합니다. 호출하는 메서드는 비동기 적으로 실행되는 방법을 알고 있어야합니다. 그렇게하기로 선택하는 방법은 사업입니다.

내 질문은 이러한 메서드가 실제로 여러 코어를 활용하고 병렬로 실행됩니까 아니면 비동기 메서드가 호출자와 동일한 스레드 코어에서 실행됩니까?

다시 말하지만, 그것은 전적으로 호출하는 메서드에 달려 있습니다 . 모든 await작업은 비동기 작업의 연속으로 전달 될 수있는 대리자로 메서드를 다시 작성하도록 컴파일러에 지시하는 것입니다. 즉, await FooAsync()"호출 FooAsync()및 돌아 오는 모든 것은 방금 시작된 비동기 작업을 나타내는 것이어야합니다. 비동기 작업이 완료되었음을 알면이 대리자를 호출해야한다는 것을 알려주십시오."라는 의미입니다. 대리자는 호출 될 때 현재 메서드가 "중단 된 위치"에서 다시 시작되는 것처럼 보이는 속성을 갖습니다.

일정을 호출하는 메서드가 다른 코어에 선호되는 다른 스레드에서 작동한다면 좋습니다. 앞으로 UI 스레드에서 일부 이벤트 핸들러를 핑하는 타이머를 시작하면 좋습니다. await상관 없어요. 비동기 작업이 완료되면 제어가 중단 된 부분부터 다시 시작되도록하는 것뿐입니다.

물어 보지 않았지만 아마도 가져야 할 질문은 다음과 같습니다.

비동기 작업이 완료되고 제어가 중단 된 지점에서 선택되면 이전과 동일한 스레드에서 실행됩니까?

상황에 따라 다릅니다. UI 스레드에서 무언가를 기다리는 winforms 애플리케이션에서 제어는 UI 스레드에서 다시 선택됩니다. 콘솔 애플리케이션에서는 아닐 수도 있습니다.


Eric Lippert는 훌륭한 대답을합니다. async병렬 처리를 조금 더 설명하고 싶었습니다 .

간단한 "직렬"접근 방식은 await한 번에 한 가지만 수행하는 것입니다.

static void Process()
{
  Thread.Sleep(100); // Do CPU work.
}

static async Task Test()
{
  await Task.Run(Process);
  await Task.Run(Process);
}

이 예제에서 Test메서드는 Process스레드 풀에 대기 하고 완료되면 Process스레드 풀에 다시 대기 합니다. Test방법은 ~ 200ms 후에 완료됩니다. 언제든지 하나의 스레드 만 실제로 진행 상황을 진행하고 있습니다.

이것을 병렬화하는 간단한 방법은 다음을 사용하는 것입니다 Task.WhenAll.

static void Process()
{
  Thread.Sleep(100); // Do CPU work.
}

static async Task Test()
{
  // Start two background operations.
  Task task1 = Task.Run(Process);
  Task task2 = Task.Run(Process);

  // Wait for them both to complete.
  await Task.WhenAll(task1, task2);
}

이 예제에서 Test메서드 Process는 스레드 풀에 두 번 대기열 에 추가 된 다음 둘 다 완료 될 때까지 기다립니다. Test방법은 ~ 100ms 후에 완료됩니다.

Task.WhenAll(및 Task.WhenAny)은 async/ 와 함께 도입되어 await간단한 병렬 처리를 지원합니다. 그러나 더 고급이 필요한 경우 TPL이 여전히 존재합니다 (진정한 CPU 바운드 병렬 처리가 TPL에 더 적합합니다). TPL은 async/ 와 함께 잘 작동 await합니다.

나는 기본 다루 async내에서 병렬 처리를 하기로 async포스트 블로그 에릭 언급 것을,뿐만 아니라 "상황을".


비동기 메서드는 대기 가능한 개체 (메서드가있는 개체)를 반환하며 GetAwaiter, await키워드로 메서드를 호출하면 컴파일러에서 해당 개체를 사용하는 코드를 생성 할 수 있습니다 . await 키워드 없이 이러한 메서드 자유롭게 호출 하고 객체를 명시 적으로 사용할 수도 있습니다.

The object encapsulates an asynchronous action, which may or may not run on another thread. Eric Lippert's article Asynchrony in C# 5.0 part Four: It's not magic considers an example of asynchronous programming that involves only one thread.


Since async and await are based around the TPL, they should work very similarly. By default, you should treat them as if they run on a separate thread.

참고URL : https://stackoverflow.com/questions/9898441/do-the-new-c-sharp-5-0-async-and-await-keywords-use-multiple-cores

반응형