3

我正在观看有关 Async CTP 的视频,并看到如果您从例如主线程调用 await ,那么当工作完成时,执行将从主线程继续。

例如

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

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

在某种程度上,这一定是正在发生的事情,因为您可以使用 Task.FromAsync 将普通异步方法包装在 T 的 Task 中

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

4

2 回答 2

6

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

假设您正在等待 a Task<T>,它实际上是在调用Task<T>.ContinueWith(continuationAction, scheduler).

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

于 2011-04-13T09:37:23.363 回答
0

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

于 2011-05-04T03:30:01.887 回答