1 回答
TA贡献1829条经验 获得超7个赞
简而言之,当SynchronizationContext.Current
未设置时,(控制台应用程序就是这种情况)。在 上调用 await 响应ThreadPool
。
controlToSendTo.BeginInvoke();
在 Winforms/WPF 上,实现了 SynchronizationContext 以将对 winforms或 WPF的响应排队Dispatcher.BeginInvoke();
。
参考:
Await、SynchronizationContext 和控制台应用程序(开发团队成员的博客文章):
但是有一种常见的应用程序没有
SynchronizationContext
:控制台应用程序。当您的控制台应用程序的Main
方法被调用时,SynchronizationContext.Current
将返回null
. 这意味着如果您在控制台应用程序中调用一个异步方法,除非您做一些特殊的事情,否则您的异步方法将没有线程亲和力:这些异步方法中的延续最终可能会“在任何地方”运行。Parallel Computing - It's All About the SynchronizationContext(这篇文章引用自该类的官方文档
SynchronizationContext
):默认情况下,控制台应用程序和 Windows 服务中的所有线程都只有默认的
SynchronizationContext
....
图 4
SynchronizationContext
实施摘要
...
╔═════════╦═══════════╦════════════╦════════════╦══════════╦══════════╗
║ ║ Specific ║ Exclusive ║ Ordered ║ Send May ║ Post May ║
║ ║ Thread ║ (Delegates ║ (Delegates ║ Invoke ║ Invoke ║
║ ║ Used to ║ Execute ║ Execute ║ Delegate ║ Delegate ║
║ ║ Execute ║ One at ║ in Queue ║ Directly ║ Directly ║
║ ║ Delegates ║ a Time) ║ Order) ║ ║ ║
╠═════════╬═══════════╬════════════╬════════════╬══════════╬══════════╣
║ ... ║ ║ ║ ║ ║ ║
╠═════════╬═══════════╬════════════╬════════════╬══════════╬══════════╣
║ Default ║ No ║ No ║ No ║ Always ║ Never ║
╚═════════╩═══════════╩════════════╩════════════╩══════════╩══════════╝
- 1 回答
- 0 关注
- 75 浏览
添加回答
举报