gpt4 book ai didi

c# - 书中的短语 "The current SynchronizationContext is a property of the current thread"是否正确”?

转载 作者:行者123 更新时间:2023-11-30 20:02:48 29 4
gpt4 key购买 nike

阅读了短语 "The current SynchronizationContext is a property of the current thread" correct" ,我有点懵了……

在 VS2010 的 C# 应用程序代码中,当我键入 Thread.CurrentThread. 时,我没有在 Intellisense 提供的选项下拉列表中找到线程的任何上下文相关属性。

我知道可以通过 "= SynchronizationContext.Current;"获取当前同步上下文。但这在并行线程、任务等中同时执行就不太幸运了。

假设我从控制台或 WPF (*) 应用创建并启动 a few Windows forms in its own main UI threads以及 TPL 任务。

我误解了每个 winform 都应该有自己的 WindowsFormaSynchronizationContext , WPF 应该有自己的 DispatcherSynchronizationContext (SynchronizationContext class 的子类)实例,任务在 ThreadPool 中执行有自己的同步上下文,LongRunning任务很可能会在其自己的同步上下文中从线程池中执行...

那么,为什么不能从线程定义SynchronizationContext"Get SynchronizationContext from a given Thread"的所有答案问题似乎一致否定了这种可能性……

最后但同样重要的是:
是语句"The current SynchronizationContext is a property of the current thread" correct"对吗?
那么,如何为不同的特定线程实例获取此属性的值呢?

(*)
最近,我获得了基本上使用 winforms 的 C# WPF 应用程序代码。

最佳答案

这是准确的。 SynchronizationContext.Current 属性使用当前线程的 m_ExecutionContext 字段。这是 Thread 类的私有(private)字段,这就是您在 IntelliSense 下拉列表中看不到它的原因。

重要的是它以这种方式工作,默认的 SynchronizationContext 不同步任何东西。它的 Post() 方法目标在线程池线程上运行。将目标调用编码到特定 线程是一件非常重要的事情。这需要目标线程的帮助,它需要提供解决方案 producer-consumer problem .通用解决方案是一个从线程安全队列中检索消息的循环。正是 Winforms 或 WPF 应用程序的 UI 线程的工作方式,它们“泵送消息循环”。 Application.Run() 启动该循环。

因此,只有此类应用的 UI 线程才能支持不使用线程池线程来运行 Post() 委托(delegate)目标的同步提供程序。因此,只要您创建窗体或窗口,Winforms 和 WPF 就会安装它们自己的同步提供程序。并且只有在 UI 线程上运行的代码才能从 SynchronizationContext.Current 属性中看到该非默认提供程序。

结果是您必须在 UI 线程上初始化需要将调用编码回 UI 线程的代码。因此,例如创建 BackgroundWorker 必须在 UI 线程上完成。或者使用 TaskScheduler.FromCurrentSynchronizationContext 创建的任务。从技术上讲,可以有多个线程显示 UI,无论运行初始化代码的线程都决定了 Post() 委托(delegate)目标将在何处运行。这可能解释了您的问题,如果您的初始化代码在工作线程上运行,则 Post() 目标在线程池线程上运行。您可以将对 Synchronization.Current 对象的引用传递给工作线程,只要您在 UI 线程上获得该引用即可。

关于c# - 书中的短语 "The current SynchronizationContext is a property of the current thread"是否正确”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16296369/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com