29

이 질문에는 이미 답변이 있습니다.

빠른 질문..

비동기 프로그래밍에 대한 견고한 기초 지식을 얻으려면await다중 스레드 및 실행 순서와 시간에 관해서이 두 코드 조각의 차이점을 알고 싶습니다.

:

public Task CloseApp()
{
        return Task.Run(
                         ()=>{ 
                                // save database
                                // turn off some lights
                                // shutdown application
                          });
}

이것에 비해 :

public async Task CloseApp()
{
        await Task.Run(
                         ()=>{ 
                                // save database
                                // turn off some lights
                                // shutdown application
                          });
}

이 루틴에서 내가 부르면 :

private async void closeButtonTask()
{
    // Some Task 1
    // ..

    await CloseApp();

    // Some Task 2
    // ..
}


2 답변


31

그것은 거의 동일합니다 (스레드 등의 관점에서). 그러나 두 번째 경우 (await) 많은 오버 헤드가 컴파일러에 의해 생성됩니다.

다음과 같이 선언 된 메소드async그리고await~로 변환된다.상태 머신컴파일러에 의해. 그래서 당신이await, 제어 흐름은 호출 메소드로 리턴되고 당신의 실행async메소드가await기다리고있을 때Task끝내다.

이후에 더 이상 코드가 없으므로await, 사용할 필요가 없습니다.await어쨌든. 간단히Task충분하다.


  • 당신이 기다렸을 때, 제어 흐름은 호출 메소드 "- 제어 흐름기다리는 작업이 이미 완료되면 호출 메서드에 반환됩니다. - acelent
  • 세부 사항에 대한 @acelent thx, 작업이 이미 끝났을 때 일어나는 일에 대해서는 전혀 생각하지 않았습니다. 컴파일러가 라인별로 수행하는 정확한 내용을 알지 못합니다. - René Vogt
  • 나는 이걸 완전히 이해하지 못한다. - monstro
  • 작업이 완료되면 스레드 풀의 스레드가Post메서드를 호출하고 호출자에게 작업이 완료되었음을 알립니다. 나머지 비동기 메소드는 다음과 같이 실행됩니다.ContinueWith. 실행은 기다리는 지점부터 계속되지만 다른 스레드에서 실행될 수 있습니다. - Joseph Katzman

5

두 가지 접근 방식 간에는 거의 차이점이 없습니다. 기본적으로 동일한 의미를 공유합니다. 그러나 async / await가있는 버전은 외부 컴파일러에서 생성 된 작업에서 내부 작업의 실행을 래핑합니다. 비동기 버전은 그렇지 않습니다. 따라서 비동기 버전은 (매우 약간) 효율적입니다.


  • "비동기 버전은 매우 (아주 조금) 효율적"이다.즉, 메서드가 매우 자주 호출되는 경우 비동기 / 대기중인 버전에서는 상태 시스템과 다른 작업 인 두드러진 쓰레기가 생성 될 수 있습니다. - acelent
  • @acelent : 일부 세대 0 쓰레기를 생성하는 것은 여전히 나에게 아주 중요하다고 느낍니다. - Falanwe
  • 좋아, 나는 그것이 항상 모든 사람에게 해당되는 것은 아니라는 점을 지적하고자한다.1), 작업에 대한 참조 또는 작업에 대한 참조를 사용하여 임시 (2,0시 25 분 40 초에,0시 30 분 20 초에). - acelent

연결된 질문


관련된 질문

최근 질문