书中的短语“当前 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 是当前线程的属性”正确吗? 的相关文章

  • 多个对象以某种方式相互干扰[原始版本]

    我有一个神经网络 NN 当应用于单个数据集时 它可以完美地工作 但是 如果我想在一组数据上运行神经网络 然后创建一个新的神经网络实例以在不同的数据集 甚至再次同一组数据 上运行 那么新实例将产生完全错误的预测 例如 对 XOR 模式进行训练
  • 调试VS 2005提示“操作不支持”

    我一直在调试 VS 2005 并将 启动外部程序 设置为 C Program Files Microsoft Visual Studio 10 0 Common7 IDE devenv exe 但按 F5 后出现此错误 尝试运行项目时出错
  • Android Jasper 报告

    Jasper Reporting 可以集成到 Android 应用程序中吗 我正在尝试从 jrxml 文件生成 PDF CSV 文本和 XLS 报告 但是 我没有看到 Android SDK 支持 net sf jasperreports
  • 查找总和为给定数字的值组合的函数

    这个帖子查找提供的 Sum 值的组合 https stackoverflow com a 20194023 1561176呈现函数subsets with sum 它在数组中查找总和等于给定值的值的组合 但由于这个帖子已经有6年多了 我发这
  • 如何为不同操作系统/Python 版本编译 Python C/C++ 扩展?

    我注意到一些成熟的Python库已经为大多数架构 Win32 Win amd64 MacOS 和Python版本提供了预编译版本 针对不同环境交叉编译扩展的标准方法是什么 葡萄酒 虚拟机 众包 我们使用虚拟机和Hudson http hud
  • 在 VS2008 的 XAML 编辑器中禁用 Intellisense?

    有没有办法在 Visual Studio 2008 的 XAML 编辑器中禁用 Intellisense 打字时通常会消耗很大的性能 有时我会等待十秒或更长时间 直到列表自动弹出 似乎在 选项 gt 文本编辑器 gt XAML 中 Inte
  • 查询联系人 - 有时返回空游标

    我正在尝试查询联系人的显示名称 Override public void onActivityResult int requestCode int resultCode Intent data switch requestCode case
  • Swing:创建可拖动组件...?

    我在网上搜索了可拖动 Swing 组件的示例 但我发现示例不完整或不起作用 我需要的是一个摇摆组件那可以是dragged通过鼠标 在另一个组件内 被拖拽的时候 应该已经 改变它的位置 而不仅仅是 跳 到目的地 我很欣赏无需非标准 API 即
  • RichFaces 应用程序,我应该使用 rich:dataTable 还是 jQGrid,优缺点吗?

    继从here https stackoverflow com questions 3899649 ok to wrap jsf components generated html with own divs using jquery aft
  • 在 javascript 中使用 xPath 解析具有默认命名空间的 XML

    我需要创建一个 XML xPath 解析器 所有解析都必须在客户端进行 使用 JavaScript 我创建了一个 javascript 来执行此操作 在默认名称空间发挥作用之前 一切看起来都正常 我根本无法查询具有默认命名空间的 XML 我
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost
  • ggplot2 的 fortify 函数出错

    我在 ggplot2 中使用 fortify 方法时收到此错误 Error in function classes fdef mtable unable to find an inherited method for function pr
  • Apache Beam Pipeline 写表后查询表

    我有一个 Apache Beam Dataflow 管道 它将结果写入 BigQuery 表 然后我想查询该表以获取管道的单独部分 但是 我似乎无法弄清楚如何正确设置此管道依赖性 我编写的新表 然后想要查询 与一个单独的表连接以进行某些过滤
  • 以 Rails 形式处理 MongoMapper EmbeddedDocument

    首先 我对一般编程和 Rails 都是新手 我选择 Rails 是因为它看起来是一种很容易上手的语言 对于我的项目 我将 MongoMapper 与 Rails 结合使用 我正在尝试以与文档相同的形式处理嵌入文档 我有以下模型 class
  • 在 for 循环比较中使用集合大小

    Java 中 Collections 的 size 方法是否有编译器优化 考虑以下代码 for int i 0 i
  • 小于或等于

    使用暂停命令我发现错误位于此代码的第一行 if choice 1 if energy gt m2enc set a enemhp enemhp m1hpd earmr pause set a energy energy m1enc set
  • 给定文档,选择相关片段

    当我在这里提出问题时 自动搜索返回的问题的工具提示给出了问题的前一点 但其中相当一部分没有给出任何比理解问题更有用的文本 标题 有谁知道如何制作一个过滤器来删除问题中无用的部分 我的第一个想法是修剪仅包含某个列表中的单词的任何前导句子 例如
  • 无法将 /root/.rnd 加载到 RNG 中

    我想使用 Windows Open SSL 生成服务器证书 当我运行此命令行时 出现此错误 我应该怎么办 Command openssl req new x509 days 3650 key ca key out ca crt Error
  • jQuery:动态添加 DOM 元素时尝试将函数挂钩到 onclick,但它立即执行该函数

    我正在使用 jQuery 动态 我的意思是在运行时 向页面的 DOM 添加一个 span 元素 create add task button document createElement span attr id activityNameH
  • Android Espresso - 如果未选中,请单击复选框

    I have onView withId R id check box perform click 但我只想在尚未选中该复选框时执行此操作 我怎样才能在浓缩咖啡中做到这一点 我还想根据其之前的状态来切换复选框 开关 起初 我尝试用此方法打开

随机推荐