【问题标题】:What are the SynchronizationContext differences between Console, Windows Forms, WPF?控制台、Windows 窗体、WPF 之间的 SynchronizationContext 有什么区别?
【发布时间】:2021-11-10 01:21:05
【问题描述】:

我了解任务只是异步执行的抽象。在幕后,运行时仍然需要开发方法让我们的代码异步运行。我知道根据运行我们代码的应用程序的类型,有不同的实现方式:例如,在 asp.net 中,它似乎为每个任务创建一个线程,并具有与之关联的 HTTP 请求。另一方面,控制台应用程序只是在线程池中运行任务(如果我的理解有误,请纠正)。

我了解这些不同的实现是同步上下文。我错了或太模糊的变化很高。我想了解不同应用程序之间的各种 SynchronizationContext 差异。

我很惭愧地说我已经使用.net 多年了,但我仍然不了解 SynchronizationContext。我也有一种感觉,很多人也不这样做。我阅读了大量文章和官方文档,但没有任何点击。我阅读了大部分关于这个主题的文章,但我仍然对这个问题感到困惑。

【问题讨论】:

  • 控制台应用程序通常没有同步上下文;现代的asp.net也不行;旧的 asp.net 在不同的版本和兼容性级别上有两种不同的同步上下文 - 旧的不能很好地处理任务,而新的……嗯,它仍然不是很好,但它更好。但这个想法是为了帮助将请求生命周期联系在一起。 Winforms 和 WPF 有一个同步上下文,可以将内容推送到相关的 UI 线程。老实说,大多数时候,大多数人不需要了解同步上下文。
  • "控制台应用程序只在线程池中运行任务"同步上下文比任务早,除了await 默认捕获同步上下文并尝试使用它(如果有的话)在适当的上下文中重新激活

标签: c# async-await


【解决方案1】:

很久以前,我一直被同一个问题困扰。不幸的是,我自己没有机会找到明确的答案,因为我没有深入研究它的冲动——只是我的好奇心,所以它就沉没在我的积压中。

这里有一些对我有帮助的链接。我不确定你是否已经遇到过它们,但我希望这会有所帮助:

解释这个东西是什么并写一个你自己的例子的三个部分系列:https://www.codeproject.com/Articles/31971/Understanding-SynchronizationContext-Part-Ihttps://www.codeproject.com/Articles/32113/Understanding-SynchronizationContext-Part-IIhttps://www.codeproject.com/Articles/32119/Understanding-SynchronizationContext-Part-III

我在async/await 的背景下探索它,所以也许这篇关于它的博文也可以帮助你:https://devblogs.microsoft.com/oldnewthing/20170720-00/?p=96655(它还包含一个有用的链接:https://docs.microsoft.com/en-us/archive/msdn-magazine/2011/october/asynchronous-programming-pause-and-play-with-await)。

P。 S. 我知道这几乎不是一个答案,所以我会在评论中发布这个,但符号限制会让它成为一场噩梦。我希望有人会在这里发布明确的答案,因为我也对这个主题感兴趣:)

【讨论】:

    猜你喜欢
    • 2020-11-08
    • 2014-07-21
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    相关资源
    最近更新 更多