이 질문에는 이미 답변이 있습니다.
빠른 질문..
비동기 프로그래밍에 대한 견고한 기초 지식을 얻으려면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
// ..
}
그것은 거의 동일합니다 (스레드 등의 관점에서). 그러나 두 번째 경우 (await
) 많은 오버 헤드가 컴파일러에 의해 생성됩니다.
다음과 같이 선언 된 메소드async
그리고await
~로 변환된다.상태 머신컴파일러에 의해. 그래서 당신이await
, 제어 흐름은 호출 메소드로 리턴되고 당신의 실행async
메소드가await
기다리고있을 때Task
끝내다.
이후에 더 이상 코드가 없으므로await
, 사용할 필요가 없습니다.await
어쨌든. 간단히Task
충분하다.
Post
메서드를 호출하고 호출자에게 작업이 완료되었음을 알립니다. 나머지 비동기 메소드는 다음과 같이 실행됩니다.ContinueWith
. 실행은 기다리는 지점부터 계속되지만 다른 스레드에서 실행될 수 있습니다. - Joseph Katzman
두 가지 접근 방식 간에는 거의 차이점이 없습니다. 기본적으로 동일한 의미를 공유합니다. 그러나 async / await가있는 버전은 외부 컴파일러에서 생성 된 작업에서 내부 작업의 실행을 래핑합니다. 비동기 버전은 그렇지 않습니다. 따라서 비동기 버전은 (매우 약간) 효율적입니다.