Gen*_*нин 2 c# multithreading synchronizationcontext task-parallel-library thread-synchronization
阅读短语"当前的SynchronizationContext是当前线程的属性"更正",我有点困惑......
在VS2010中的C#应用程序代码中,当我输入时,Thread.CurrentThread.我没有在Intellisense给出的选项的下拉列表中找到线程的任何上下文相关属性.
我知道当前的同步上下文可以通过" = SynchronizationContext.Current;"获得.但是,并行线程,任务等同时执行并不是很幸运.
假设从一个控制台或WPF (*)应用程序,我在自己的主UI线程和TPL任务中创建并启动一些Windows窗体.
我认为每个winform都应该有自己的WindowsFormaSynchronizationContext,WPF应该有自己的DispatcherSynchronizationContext(SynchronizationContext类的子类)实例,任务在ThreadPool中用自己的同步上下文 执行,LongRunning任务也可以在其中执行线程池.拥有同步上下文......
那么,为什么不能SynchronizationContext从线程中定义?"从给定线程中获取同步语言"问题的所有答案似乎都不一致否定了这种可能性......
最后,但并非最不重要:
短语"当前SynchronizationContext是当前线程的属性"正确"正确吗?
那么,我怎样才能获得不同特定线程实例的此属性的值?
(*)
最近,我基本上使用winforms获得了C#WPF应用程序代码.
这是准确的.SynchronizationContext.Current属性使用当前线程的m_ExecutionContext字段.这是Thread类的私有字段,这就是为什么你没有在IntelliSense下拉列表中看到它.
重要的是它以这种方式工作,默认的SynchronizationContext不会同步任何东西.它的Post()方法目标在线程池线程上运行.将目标调用封送到特定线程是一项非常重要的事情.这需要目标线程的帮助,它需要为生产者 - 消费者问题提供解决方案.通用解决方案是一个从线程安全队列中检索消息的循环.正是Winforms或WPF应用程序的UI线程的工作方式,它们"抽取消息循环".Application.Run()启动该循环.
因此,只有这样的应用程序的UI线程可以支持不使用线程池线程来运行Post()委托目标的同步提供程序.因此,Winforms和WPF会在您创建表单或窗口时立即安装自己的同步提供程序.并且只有在UI线程上运行的代码才能从SynchronizationContext.Current属性中看到非默认提供程序.
结果是您必须初始化需要将调用封送回UI线程上的UI线程的代码.因此,例如,必须在UI线程上创建BackgroundWorker.或者使用TaskScheduler.FromCurrentSynchronizationContext创建的任务.从技术上讲,可以有多个显示UI的线程,init代码运行的任何线程都决定了Post()委托目标的运行位置.这可能解释了您的问题,如果您的init代码在工作线程上运行,那么Post()目标在线程池线程上运行.你可以为你获得的UI线程上引用传递到Synchronization.Current对象的引用到一个工作线程,只要.