2011-04-13 7 views
3

비동기 CTP에 관한 비디오를보고 있었는데 예를 들어 전화를 걸면 메인 쓰레드이면, 작업이 끝나면 메인 쓰레드에서 계속 실행됩니다.C# 5 비동기는 어떻게 메인 스레드로 돌아 갑니까?

//called from main thread 
var result = await SomeAsyncWork(); 
//this will execute in main thread also 
console.writeline(result) 

예컨대 나는 다시 작업자 스레드에서 실행 될 수있는가는 정상적인 호출이있을 것이라는 순진한 인상을 가지고 있었다. 당신은 작업자 스레드에서 실행됩니다 Task.FromAsync

하지만 정상 비동기 방법과 T의 작업에 정상 비동기 방법을 포장 할 수 있기 때문에 일어나고, 그래서 어떻게 무슨 수 있어야 어떤 수준에서

은의 콜백입니다 workerthread가 주 스레드로 마샬링 되었습니까?

답변

6

콜백은 현재 작업 스케줄러를 사용하여 작업에 연결됩니다 (대기 중일 때 "현재", 완료시 현재가 아닌 경우). UI 스레드의 경우 현재 작업 스케줄러가 UI 스레드 내에서 실행될 콜백을 예약합니다 ... 스레드 풀 스레드에 대해 스레드 풀 스레드 등에서 실행할 수 있습니다.

Task<T>을 기다리고 있다고 가정하면 실제로는 Task<T>.ContinueWith(continuationAction, scheduler)입니다.

사용할 수있는 방법이 무엇이든 기다릴 수는 있지만 BeginAwait 일정이 구현에 따라 달라지는 이유는 무엇입니까? 아마 가장 공통적 인 것이기 때문에 나는 태스크 기반의 것을 언급했을 뿐이다. 컴파일러 자체는 이것을 전혀 지정하지 않습니다. 라이브러리가 올바른 일을한다고 가정합니다. 모든 컴파일러는 "나머지 메서드"를 연속으로 변환하여 BeginAwait에 전달합니다.

관련 문제