【发布时间】:2021-11-10 01:21:05
【问题描述】:
我了解任务只是异步执行的抽象。在幕后,运行时仍然需要开发方法让我们的代码异步运行。我知道根据运行我们代码的应用程序的类型,有不同的实现方式:例如,在 asp.net 中,它似乎为每个任务创建一个线程,并具有与之关联的 HTTP 请求。另一方面,控制台应用程序只是在线程池中运行任务(如果我的理解有误,请纠正)。
我了解这些不同的实现是同步上下文。我错了或太模糊的变化很高。我想了解不同应用程序之间的各种 SynchronizationContext 差异。
我很惭愧地说我已经使用.net 多年了,但我仍然不了解 SynchronizationContext。我也有一种感觉,很多人也不这样做。我阅读了大量文章和官方文档,但没有任何点击。我阅读了大部分关于这个主题的文章,但我仍然对这个问题感到困惑。
【问题讨论】:
-
控制台应用程序通常没有同步上下文;现代的asp.net也不行;旧的 asp.net 在不同的版本和兼容性级别上有两种不同的同步上下文 - 旧的不能很好地处理任务,而新的……嗯,它仍然不是很好,但它更好。但这个想法是为了帮助将请求生命周期联系在一起。 Winforms 和 WPF 有一个同步上下文,可以将内容推送到相关的 UI 线程。老实说,大多数时候,大多数人不需要了解同步上下文。
-
"控制台应用程序只在线程池中运行任务"同步上下文比任务早,除了
await默认捕获同步上下文并尝试使用它(如果有的话)在适当的上下文中重新激活
标签: c# async-await