书中的短语“当前 SynchronizationContext 是当前线程的属性”正确吗?

2024-04-21

读完这句话后, 我有点困惑...

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

我知道当前的同步上下文可以通过“= SynchronizationContext.Current;但对于同时在并行线程、任务等中执行的情况来说,这就不太幸运了。

假设从控制台或 WPF(*)我创建并启动的应用程序一些 Windows 窗体在其自己的主 UI 线程中 http://reedcopsey.com/2011/11/28/launching-a-wpf-window-in-a-separate-thread-part-1/以及 TPL 任务。

我不明白每个winform应该有自己的Windows 窗体同步上下文 http://msdn.microsoft.com/en-us/library/system.windows.forms.windowsformssynchronizationcontext.aspx,WPF应该有自己的调度程序同步上下文 http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatchersynchronizationcontext.aspx(子类SynchronizationContext 类 http://msdn.microsoft.com/en-us/library/system.threading.synchronizationcontext.aspx)实例,任务在a中执行线程池 http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx具有自己的同步上下文,长跑 http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskcreationoptions.aspx任务可能会在其自己的同步上下文中从线程池中执行...

那么,为什么不能SynchronizationContext从线程定义?所有答案“从给定线程获取 SynchronizationContext” https://stackoverflow.com/a/4107653/200449这个问题似乎一致否定了这种可能性......

最后但并非最不重要的一点是:
是短语正确的?
那么,如何获取不同特定线程实例的该属性的值呢?

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


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

重要的是它以这种方式工作,默认的 SynchronizationContext 不同步任何内容。它的 Post() 方法目标在线程池线程上运行。将目标调用编组到specific线程是一件非常重要的事情。这需要目标线程的帮助,它需要提供一个解决方案生产者-消费者问题 http://en.wikipedia.org/wiki/Producer-consumer_problem。通用解决方案是从线程安全队列中检索消息的循环。与 Winforms 或 WPF 应用程序的 UI 线程的工作方式完全相同,它们“泵送消息循环”。 Application.Run() 启动该循环。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

书中的短语“当前 SynchronizationContext 是当前线程的属性”正确吗? 的相关文章

随机推荐