C#5异步如何返回主线程?

时间:2011-04-13 09:34:45

标签: c#-5.0 async-ctp

我正在观看有关Async CTP的视频,并看到如果你打电话等待主线程,然后在工作完成后执行将从主线程继续。

e.g

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

我有一种天真的印象,就是会有一个正常的回调,会在工作线程上执行。

在某种程度上,必须是正在发生的事情,因为你可以使用Task.FromAsync在T的任务中包装普通的异步方法

但正常的异步方法将在工作线程中运行,那么如何将workerthread中的回调编组回主线程?

2 个答案:

答案 0 :(得分:6)

使用当前任务调度程序(在等待时为“当前”,而不是在完成时为当前任务调度程序)将回调附加到任务。对于UI线程,当前任务调度程序将调度要在UI线程内执行的回调...对于线程池线程,调度程序将允许它在任何线程池线程上执行,等

假设您正在等待Task<T>,它正在有效地呼叫Task<T>.ContinueWith(continuationAction, scheduler)

您可以使用正确的方法等待任何事情,但BeginAwait如何安排延续是特定于实现的。我只提到了基于任务的一个,因为它可能是最常见的一个。编译器本身根本没有指定它 - 它假定库将做正确的事情。所有编译器都将“方法的其余部分”转换为延续,并将其传递给BeginAwait

答案 1 :(得分:0)

编译器以不同方式编译代码并将其拆分,以便await之后的代码成为回调。这里有一个详细的解释: http://evolpin.wordpress.com/2011/05/02/c-5-await-and-async-in-asp-net/