Async await 키워드는 ContinueWith 람다와 동일합니까?
Async await 키워드를 올바르게 이해했는지 누군가가 친절하게 확인해 주시겠습니까? (CTP 버전 3 사용)
지금까지 메서드 호출 이전에 await 키워드를 삽입하면 기본적으로 A. 즉시 반환을 생성하고 B를 생성합니다. 비동기 메서드 호출이 완료되면 호출되는 "연속"을 생성합니다. 어쨌든 연속은 메서드에 대한 코드 블록의 나머지 부분입니다.
그래서 제가 궁금한 것은이 두 비트의 코드가 기술적으로 동일합니까? 그렇다면 기본적으로 await 키워드가 ContinueWith Lambda를 생성하는 것과 동일하다는 것을 의미합니까 (즉, 기본적으로 컴파일러 바로 가기)? 그렇지 않다면 차이점은 무엇입니까?
bool Success =
await new POP3Connector(
"mail.server.com", txtUsername.Text, txtPassword.Text).Connect();
// At this point the method will return and following code will
// only be invoked when the operation is complete(?)
MessageBox.Show(Success ? "Logged In" : "Wrong password");
VS
(new POP3Connector(
"mail.server.com", txtUsername.Text, txtPassword.Text ).Connect())
.ContinueWith((success) =>
MessageBox.Show(success.Result ? "Logged In" : "Wrong password"));
일반적인 아이디어는 옳습니다-나머지 방법은 일종의 연속으로 만들어집니다.
"빠른 경로"블로그 포스트는 방법에 대한 자세한 내용이 있습니다 async
/의 await
컴파일러 변환 작업을.
내 머리 위의 차이점 :
이 await
키워드는 또한 "일정 컨텍스트"개념을 사용합니다. 스케줄링 컨텍스트는 SynchronizationContext.Current
존재하는 경우에 폴백됩니다 TaskScheduler.Current
. 그런 다음 예약 컨텍스트에서 연속이 실행됩니다. 따라서 더 가까운 근사값은으로 전달 TaskScheduler.FromCurrentSynchronizationContext
하여 필요한 경우 ContinueWith
다시 떨어지는 것 TaskScheduler.Current
입니다.
실제 async
/ await
구현은 패턴 일치를 기반으로합니다. 작업 이외의 다른 항목을 대기 할 수있는 "대기 가능"패턴을 사용합니다. 몇 가지 예로는 WinRT 비동기 API,, Yield
Rx Observable 과 같은 일부 특수 메서드 및 GC에 강하게 영향을주지 않는 특수 소켓 awaitable이 있습니다. 작업은 강력하지만 기다릴 수있는 유일한 작업은 아닙니다.
또 하나의 사소한 차이가 떠 오릅니다. awaitable이 이미 완료된 경우 async
메서드는 실제로 해당 지점에서 반환되지 않습니다. 동기식으로 계속됩니다. 따라서 통과하는 것과 비슷 TaskContinuationOptions.ExecuteSynchronously
하지만 스택 관련 문제가 없습니다.
그것은 "본질적으로"그것이지만 생성 된 코드는 그 이상을 수행합니다. 생성 된 코드에 대한 자세한 내용을 보려면 Jon Skeet의 Eduasync 시리즈를 적극 권장합니다.
http://codeblog.jonskeet.uk/category/eduasync/
특히 게시물 # 7은 생성되는 항목 (CTP 2 기준)과 그 이유에 대해 설명하므로 현재 찾고있는 항목에 매우 적합 할 것입니다.
http://codeblog.jonskeet.uk/2011/05/20/eduasync-part-7-generated-code-from-a-simple-async-method/
편집 : 나는 그것이 당신이 질문에서 찾고있는 것보다 더 자세 할 것이라고 생각하지만 방법에서 여러 번 기다릴 때 상황이 어떻게 생겼는지 궁금하다면 포스트 # 9에서 다룹니다 :)
http://codeblog.jonskeet.uk/2011/05/30/eduasync-part-9-generated-code-for-multiple-awaits/
'Nice programing' 카테고리의 다른 글
git fast-forwarding이란 무엇입니까? (0) | 2020.10.10 |
---|---|
ADL이 함수 템플릿을 찾지 못하는 이유는 무엇입니까? (0) | 2020.10.10 |
.NET 용 명령 줄 인수 파서 찾기 (0) | 2020.10.10 |
libGDX에서 다른 종횡비를 처리하는 방법은 무엇입니까? (0) | 2020.10.10 |
ES6의지도 대 개체, 언제 사용합니까? (0) | 2020.10.10 |