是从一本书中短语“目前的SynchronizationContext是当前线程的属性”正确\“?(I

2019-09-01 11:18发布

看了这句话“目前的SynchronizationContext是当前线程的属性”正确的” ,我有点迷茫......

在VS2010一个C#应用代码,当I型Thread.CurrentThread. 我不是在通过智能感知给出一个线程任何上下文相关的属性,选择下拉列表中找到。

我知道,当前的同步上下文可以通过将得到“ = SynchronizationContext.Current; ”。 但是,这是不是很幸运,在并行线程,任务等同时执行

从我创建了一个控制台或WPF(*)的应用程序假设并启动在自己的主UI线程数的Windows窗体以及TPL任务。

我undermisabovestand每一个的winform应该有自己的WindowsFormaSynchronizationContext ,WPF应该有自己的DispatcherSynchronizationContext (的子类的SynchronizationContext类的实例),该任务在执行的线程池有自己的同步环境, LongRunning orobably任务将出线程池在执行其自己的同步方面...

那么,为什么不能SynchronizationContext从线程(S)定义的? 所有答案“从给定的主题获取的SynchronizationContext”的问题似乎unanmous在否定TIS可能性...

而最后,但并非最不重要:
就是那句“目前的SynchronizationContext是当前线程的属性”正确”正确吗?
然后,我怎么能得到这个属性不同的特定线程情况下的价值?

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

Answer 1:

这是准确的。 该SynchronizationContext.Current属性使用当前线程的m_ExecutionContext场。 这是Thread类的私人领域,这就是为什么你没有看到它在智能感知下拉列表。

这是它的工作原理是这样的重要,默认的SynchronizationContext不同步什么。 及其后()方法,目标在线程池线程上运行。 封送对象调用一个特定的线程是做一个非常平凡的事。 这需要从目标线的帮助下,它需要提供一个解决生产者-消费者问题 。 通用的解决方案是一个循环,从一个线程安全的队列中检索消息。 没错的方式,一个WinForms或WPF应用程序作品的UI线程,他们“泵消息循环”。 Application.Run()开始该循环。

因此,只有这样的应用程序的UI线程可以支持不使用线程池的线程来运行后()委托目标同步提供者。 因此,WinForms和WPF为您创建一个表或窗口就立即安装自己的同步提供者。 并且在UI线程上运行的唯一的代码将看到来自SynchronizationContext.Current属性,非默认提供商。

其结果是,你必须初始化需要编组回调到UI线程UI线程代码。 因此,例如,创建一个BackgroundWorker必须在UI线程来完成。 或任务与TaskScheduler.FromCurrentSynchronizationContext创建。 有技术上可以显示UI,无论线程中的初始化代码运行在决定了邮政()委托目标将运行多个线程。 这或许可以解释你的问题,如果你的初始化代码,一个工作线程运行,则帖子()目标上的线程池线程上运行。 当你获得的UI线程上的参考,你可以传递给Synchronization.Current对象的引用到一个工作线程,只要。



文章来源: Is the phrase from a book “The current SynchronizationContext is a property of the current thread” correct\"?