programing

비동기는 C#에서 어떻게 작동합니까?

newstyles 2023. 5. 9. 22:10

비동기는 C#에서 어떻게 작동합니까?

Microsoft는 오늘(2010년 10월 28일) Visual Studio Async CTP를 발표하고 다음과 같은 기능을 제공합니다.async그리고.await키워드를 C#/VB에 입력하여 비동기 메서드를 실행합니다.

처음에는 컴파일러가 키워드를 스레드 생성으로 변환한다고 생각했지만 백서와 Anders Hejlsberg의 PDC 프레젠테이션(31:00)에 따르면 비동기 작업은 메인 스레드에서 완전히 발생합니다.

동일한 스레드에서 작업을 병렬로 실행하려면 어떻게 해야 합니까?기술적으로 어떻게 가능하며 IL에서 실제로 번역된 기능은 무엇입니까?

이는 다음과 유사하게 작동합니다.yield returnC# 2.0의 키워드입니다.

비동기식 방법은 실제로 일반적인 순차적 방법이 아닙니다.일부 상태(로컬 변수가 개체의 필드로 전환됨)를 가진 상태 시스템(개체)으로 컴파일됩니다.두 가지 용도 사이의 각 코드 블록await상태 시스템의 "단계" 중 하나입니다.

즉, 메소드가 시작되면 첫 번째 단계만 실행되고 상태 시스템이 일부 작업을 반환하고 예약합니다. 작업이 완료되면 상태 시스템의 다음 단계가 실행됩니다.예를 들어 이 코드는 다음과 같습니다.

async Task Demo() { 
  var v1 = foo();
  var v2 = await bar();
  more(v1, v2);
}

다음과 같은 것으로 번역할 수 있습니다.

class _Demo {
  int _v1, _v2;
  int _state = 0; 
  Task<int> _await1;
  public void Step() {
    switch(this._state) {
    case 0: 
      this._v1 = foo();
      this._await1 = bar();
      // When the async operation completes, it will call this method
      this._state = 1;
      op.SetContinuation(Step);
    case 1:
      this._v2 = this._await1.Result; // Get the result of the operation
      more(this._v1, this._v2);
  }
}

중요한 부분은 그것이 단지 사용한다는 것입니다.SetContinuation작업이 완료되면 호출하도록 지정하는 방법Step메소드 다시 (그리고 메소드는 그것이 원래 코드의 두 번째 비트를 사용하여 실행되어야 한다는 것을 알고 있습니다._state필드)를 선택합니다.당신은 쉽게 상상할 수 있습니다.SetContinuation와 비슷할 것입니다.btn.Click += Step하나의 스레드에서 완전히 실행됩니다.

C#의 비동기 프로그래밍 모델은 F# 비동기 워크플로우(사실 일부 기술 세부 사항을 제외하고는 본질적으로 동일함)와 매우 유사하며, 다음을 사용하여 반응형 단일 스레드 GUI 애플리케이션을 작성합니다.async꽤 흥미로운 분야입니다 - 적어도 저는 그렇게 생각합니다 - 를 들어 기사를 참조하십시오 (아마도 지금 C# 버전을 작성해야 할 것 같습니다 :-).

번역은 반복기와 유사합니다.yield return) 그리고 사실, 이전에는 C#에서 비동기 프로그래밍을 구현하기 위해 반복기를 사용하는 것이 가능했습니다.저는 얼마 전에 그것에 대한 기사를 썼습니다 - 그리고 저는 그것이 여전히 당신에게 번역이 어떻게 작동하는지에 대한 통찰력을 줄 수 있다고 생각합니다.

동일한 스레드에서 작업을 병렬로 실행하려면 어떻게 해야 합니까?

그럴수는 없어요.비동기는 "병렬주의"나 "동시성"아닙니다.비동기는 병렬로 구현되거나 구현되지 않을 수 있습니다.이는 작업을 작은 덩어리로 나누고 각 작업 덩어리를 대기열에 올린 다음 스레드가 다른 작업을 수행하지 않을 때마다 각 작업 덩어리를 실행함으로써 구현될 수 있습니다.

저는 제 블로그에 이 모든 것들이 어떻게 작동하는지에 대한 일련의 기사를 가지고 있습니다. 이 질문과 직접 관련된 기사는 아마도 다음 주 목요일에 올라갈 것입니다.자세한 내용은 이 링크를 참조하십시오.

로는 가내이기로는하뭐가, 해▁the,.async그리고.await키워드는 매번 그것입니다.async방법은 다음을 사용합니다.await키워드를 지정하면 컴파일러는 메서드의 나머지 부분을 비동기 작업이 완료될 때 예약된 연속으로 변환합니다.그것은 허용됩니다.async비동기 부분이 완료되면 즉시 호출자에게 돌아가 작업을 재개하는 방법.

이용 가능한 서류에 따르면, 그것에 대한 자세한 내용이 많지만, 제가 틀리지 않는 한, 그것이 요점입니다.

제가 보기에 비동기 방법의 목적은 많은 코드를 병렬로 실행하는 것이 아니라 비동기 방법을 필요에 따라 호출할 수 있는 여러 개의 작은 청크로 절단하는 것입니다.핵심은 컴파일러가 작업/계속을 사용하여 콜백의 모든 복잡한 배선을 처리한다는 것입니다.이를 통해 복잡성을 줄일 수 있을 뿐만 아니라 비동기 방식을 기존 동기식 코드처럼 작성할 수 있습니다.

언급URL : https://stackoverflow.com/questions/4047427/how-does-async-works-in-c