我正在观看有关Async CTP的视频,并看到如果你从主线程调用等待,那么当工作完成时执行将从主线程继续.
例如
//called from main thread
var result = await SomeAsyncWork();
//this will execute in main thread also
console.writeline(result)
Run Code Online (Sandbox Code Playgroud)
我有一种天真的印象,即会有一个正常的回调,它会在工作线程上执行.
在某种程度上,必须是正在发生的事情,因为你可以使用Task.FromAsync在T的任务中包装普通的异步方法
但正常的异步方法将在工作线程中运行,那么如何将workerthread中的回调编组回主线程?
使用当前任务调度程序(在等待时为"当前",而不是在完成时为当前任务调度程序)将回调附加到任务.对于UI线程,当前任务调度程序将调度要在UI线程内执行的回调...对于线程池线程,调度程序将允许它在任何线程池线程上执行等.
假设你在等待Task<T>,它正在有效地召唤Task<T>.ContinueWith(continuationAction, scheduler).
您可以使用正确的方法等待任何事情,但是如何BeginAwait安排延续是特定于实现的.我只提到了基于任务的一个,因为它可能是最常见的一个.编译器本身根本没有指定它 - 它假定库将做正确的事情.所有编译器都将"方法的其余部分"转换为延续,并将其传递给BeginAwait.