【问题标题】:Is the phrase from a book "The current SynchronizationContext is a property of the current thread" correct"?书中的短语“当前 SynchronizationContext 是当前线程的属性”是否正确?
【发布时间】:2013-04-24 03:58:10
【问题描述】:

看了"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应该有自己的DispatcherSynchronizationContextSynchronizationContext class的子类)实例,任务在ThreadPool中执行,有自己的同步上下文@987654327 @task orobably 将在其自己的同步上下文中的线程池之外执行...

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

最后但并非最不重要的:
短语"The current SynchronizationContext is a property of the current thread" correct" 正确吗?
那么,如何获取不同特定线程实例的这个属性的值呢?

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

【问题讨论】:

    标签: c# multithreading task-parallel-library thread-synchronization synchronizationcontext


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-11-29
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 2011-09-10
      相关资源
      最近更新 更多