10

我还没有机会查看新的 C# async/await 功能的 CTP,但我想知道以下几点:

它如何与消息循环集成?我假设在标准的 Windows 应用程序(Winforms,WPF)中,通过使用Dispatcher或类似方法向应用程序的消息循环发送消息来调用延续?

如果我没有使用标准的 Windows 消息循环怎么办?例如,在 GTK# 应用程序或控制台应用程序中(如果此功能确实可以在控制台应用程序中使用)。

我在互联网上搜索了有关此的信息,但无济于事。谁能解释一下?

4

2 回答 2

6

它使用 System.Threading.SynchronizationContext.Current。WPF 和 Winforms 都安装自己的 SynchronizationContext 版本。它使用他们的消息循环将来自工作线程的调用编组回主 UI 线程。分别使用 Dispatcher.Begin/Invoke 和 Control.Begin/Invoke()。

在控制台模式应用程序中完成这项工作并不容易,它的主线程没有明确定义的“空闲”状态,它允许以安全的方式注入编组的方法调用,从而避免重入问题。您当然可以添加它,但这样做您将重新发明消息循环。

于 2011-10-12T22:02:28.930 回答
4

这一切都归结为“等待者”对它通过的延续所做的事情。

BCL 中的实现Task<T>将使用当前同步上下文(除非您要求它不使用ConfigureAwait)——这意味着在 WPF/SilverLight 中它将使用调度程序;在 Windows 窗体中,它会使用类似的东西Control.BeginInvoke,并且在线程池线程中它只会在任何线程池线程上继续运行。请注意,在 await 表达式处,您当前的上下文很重要,因为这是任务将捕获的内容,以便继续运行。

链接的博客文章(由 Mads Torgersen 撰写)很好地解释了这一切是如何在幕后工作的,我有一系列博客文章,您可能会发现它们也很有用。

于 2011-10-12T21:58:58.903 回答