比较 SynchronizationContext

2024-01-01

如何比较 SynchronizationContext?看来同一个Dispatcher在使用BeginInvoke时可以创建不同的SynchronizationContext。当我深入研究两个(不相等的)上下文时,我发现调度程序线程 ID 相同,但它们彼此并不相等。

public partial class MainWindow : Window
{
    private SynchronizationContext contexta;
    private SynchronizationContext contextb;
    private SynchronizationContext contextc;
    private SynchronizationContext contextd;

    public MainWindow()
    {
        InitializeComponent();

        contexta = SynchronizationContext.Current;

        Loaded += MainWindow_Loaded;
    }

    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        contextb = SynchronizationContext.Current;

        Dispatcher.Invoke(() =>
            {
                contextc = SynchronizationContext.Current;
            });

        Dispatcher.BeginInvoke(new Action(() =>
            {
                contextd = SynchronizationContext.Current;
            }));

        Debug.Assert(contexta != contextb);
        Debug.Assert(contexta == contextc);         // fails... why?!?!?
        Debug.Assert(contexta == contextd);         // fails... why?!?!?
        Debug.Assert(contextc == contextd);         // fails... why?!?!?
    }        

或许两者不能同时使用。我注意到这确实有效:

        contexta.Send(new SendOrPostCallback((s) =>
            {
                contexte = SynchronizationContext.Current;
            }), null);

Update但奇怪的是,它并不总是有效。

    public override void AddRange(IEnumerable<T> items)
    {
        if (SynchronizationContext.Current == _context)
        {
            base.AddRange(items);
        }
        else
        {
            _context.Send(new SendOrPostCallback((state) =>
                {
                    AddRange(state as IEnumerable<T>);
                }), items);
        }
    }

例如,永远不会获得匹配的 _context 并永远持续下去。尽管不应该。后一个示例中的线程实际上最终是相同的,并且有一个上下文,但它是不同的。

Update2好吧,我已经开始工作了,但我真的感觉不舒服。显然,当您发布或发送时,您的任务是从正确的线程运行的,但如果您不是来自 UI,则似乎会生成一个新的 SynchronizationContext。

    public override void AddRange(IEnumerable<T> items)
    {
        if (SynchronizationContext.Current == _context)
        {                       
            base.AddRange(items);
        }
        else
        {
            _context.Post(new SendOrPostCallback((state) =>
                {
                    if (SynchronizationContext.Current != _context)
                        SynchronizationContext.SetSynchronizationContext(_context);     // called every time.. strange
                    AddRange(items);
                }), null);
        }
    }

看看这个:

“需要直接调用者完全信任。部分信任或透明的代码不能使用此成员。” :(


我认为你感兴趣BaseCompatibilityPreferences.ReuseDispatcherSynchronizationContextInstance http://msdn.microsoft.com/fr-fr/library/vstudio/system.windows.basecompatibilitypreferences.reusedispatchersynchronizationcontextinstance.aspx.

此设置指示单个 SynchronizationContext 实例是否用于给定的 Dispatcher 对象。在 .net 4 之前默认为 true,在 .net 4.5 中默认为 false(这是 LukeN 观察到的行为变化)。

现在,如果您的目标只是直接调用而不是调用 .Send() 我会说:

  1. 当调用 .Send() 时,如果您位于正确的线程上(不使用调度程序队列),DispatcherSynchronizationContext 实际上只是直接调用,因此无论如何您都不会获得太多(来自额外层的一些检查和调用)间接)。

  2. 如果您只针对 WPF 进行编码,则可以使用 Dispatcher.CheckAccess() 和 Dispatcher.Invoke() 来执行您想要的操作。

在一般情况下,无法“比较”两个 SynchronizationContext,因此您应该只调用 .Send()。无论如何,这不太可能是性能问题,请记住,过早的优化是万恶之源 -> 首先衡量。

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

比较 SynchronizationContext 的相关文章

  • 为什么“dtoa.c”包含这么多代码?

    我将是第一个承认我对低级编程的整体知识有点稀疏的人 我理解许多核心概念 但我不经常使用它们 话虽这么说 我对需要多少代码感到非常惊讶dtoa c http www netlib org fp dtoa c 在过去的几个月里 我一直致力于用
  • Postsharp 不登录跟踪级别

    我喜欢在跟踪级别记录一些 Postsharp 消息 不幸的是 日志到这个级别没有打印任何输出 所有其他级别都在工作 与控制台或 NLog 后端或从其他类登录时的行为相同 如何启用跟踪级别 应用程序 xaml cs Log Attribute
  • 如何在 Caliburn.Micro 中使用 Conductor 的依赖注入

    我有时用Caliburn Micro http caliburnmicro com创建应用程序 使用最简单的 BootStrapper 我可以像这样使用 IoC 容器 SimpleContainer private SimpleContai
  • 是否保证 sizeof(T[N]) == N * sizeof(T) ?

    我一直假设 N 个元素类型的数组的大小T 由返回sizeof保证正好是N次sizeof T The 对这个问题的评论 https stackoverflow com questions 46457449 is it always the c
  • OpenCV SVM 给出奇怪的预测结果

    我对 OpenCV 和支持向量机都很陌生 我想使用 SVM 训练具有两个标签的数据集 然后预测给定集合的标签 我当前的集合包含大约 600 行 具有相等的类分布 1 为 300 行 1 为 300 行 包含 34 列 这是我当前用于设置 O
  • 更改图像颜色与透明背景

    我需要使用 c System Drawings 将透明背景上带有绿色圆圈的图像加载到位图图像中 这是最简单的部分 但是 我需要在将其添加到更大的图像之前更改圆圈的颜色 而不影响周围的透明度 就我而言 我需要将圆圈颜色更改为黄色并将其添加为太
  • 带有嵌入 Flash 视频的 PDF 示例?

    有谁知道我在哪里可以查看嵌入 Flash 视频的 PDF 示例 我知道问这个问题很愚蠢 因为你会认为任何面向技术的用户都应该能够使用谷歌找到一个 但我真的找不到 我的另一个问题是 使用 C 中的 API 将 Flash 视频嵌入 PDF 文
  • 使用 LINQ 展平嵌套字典

    所以我有一本形式的字典Dictionary
  • 微软怎么能说WinAPI中一个字的大小是16位呢?

    我刚刚开始学习WinAPI 在MSDN中 对WORD数据类型提供了以下解释 WORD16 位无符号整数 范围是十进制 0 到 65535 该类型在 WinDef h 中声明如下 typedef 无符号短 WORD 很简单 而且它与我一直在使
  • _MM_TRANSPOSE4_PS 在 GCC 中导致编译器错误?

    我第一次在 GCC 而不是 MSVC 中编译我的数学库 并经历了所有的小错误 我遇到了一个根本没有意义的错误 Line 284 error lvalue required as left operand of assignment 284号
  • FFplay成功移入我的Winform中,如何设置它无边框?

    用这个代码 在 C 应用程序中显示 tcp 视频流 来自 FFPLAY FFMPEG https stackoverflow com questions 14201894 show a tcp video stream from ffpla
  • 使用 FromBase64Transform 解码 base64 文件流

    The example https msdn microsoft com en us library system security cryptography frombase64transform 28v vs 110 29 aspx从M
  • 如何解析多态 JSON 数组?

    我有一个 JSON 格式的文件 其中包含个人用户的记录 一些用户的记录中间有一个评论字段 我只想解析顶级项目 全名 贡献者姓名 电子邮件 使用 Newtonsoft JSON 解析器 但我似乎无法让它识别单个对象 当我将整个字符串解析为一个
  • 如何将输出重定向到 boost 日志?

    我有一个使用boost log的C 程序 我加载了用户提供的动态链接库 我想将 stderr 重定向到 boost 日志 以便用户的库随时执行以下操作 std cerr lt lt Some stuff 它产生相同的结果 BOOST LOG
  • 当分配返回 0 时,具有空异常规范的运算符 new 调用构造函数

    我有以下声明 void operator new size t s PersistentMemory m throw return m gt allocatePersistentMemory s 我正在测试启动时的内存耗尽 这会导致m gt
  • 我的代码哪里有泄漏?

    下面是我的代码 它打开一个 XML 文件 old xml 过滤无效字符并写入另一个 XML 文件 abc xml 最后 我将再次加载 XML abc xml 当执行以下行时 出现异常 表示 xml 文件被另一个进程使用 xDoc Load
  • Rx 在不同的线程上生产和消费

    我试图通过此处的示例代码来简化我的问题 我有一个生产者线程不断地输入数据 并且我尝试在批次之间添加时间延迟来对其进行批处理 以便 UI 有时间渲染它 但结果并不如预期 生产者和消费者似乎在同一个线程上 我不希望批处理缓冲区在正在生成的线程上
  • 从 AuthorizeAttribute 继承的属性不起作用

    我目前正在尝试根据用户角色在新的 ASP MVC 5 应用程序中实现安全性 目标是防止用户在没有特定角色 或更高角色 的情况下访问某些控制器或控制器方法 根据到目前为止我所读到的问题 我创建了一个继承 AuthorizeAttribute
  • Membership.ValidateUser() 的目的是什么

    我一直在学习有关MembershipProvider类 我认为Membership ValidateUser 方法应该用于登录用户 然而我刚刚了解到有一个FormsAuthentication Authenticate 目的是什么Valid
  • 打印任何类型的数组和列表的通用方法[重复]

    这个问题在这里已经有答案了 每当我调试一段涉及整数 双精度 字符串等数组或列表的代码时 有时我更喜欢打印它们 我为此所做的是为不同类型编写重载的 printArray printList 方法 for e g 我可能有这 3 种方法来打印各

随机推荐

  • 带有打字稿的 nextjs API,将 NextApiRequest 查询参数限制为字符串类型[重复]

    这个问题在这里已经有答案了 在这个端点处理程序中 有没有办法限制req query在 NextJS 中NextApiRequest只是string类型而不是string string 例如 someQueryParam这里是string s
  • 内核模块如何卸载自身而不在内核日志中生成错误?

    我制作了一个简单的模块 可以在加载时打印 GDT 和 IDT 当它完成工作后 就不再需要它并且可以卸载 但如果它返回负数以停止加载 insmod会抱怨 并且错误消息将记录在内核日志中 内核模块如何优雅地卸载自身 据我所知 使用库存内核是不可
  • 如何设计系统以允许加密迁移?

    我想建立一个系统 允许我将加密密码 哈希密码 从一个系统迁移到另一个系统 我该怎么做 比如说 2 个月后 我发现了一种加密方法 其性能提高了 10 倍 并且当前的哈希函数已被毫无疑问地证明是完全脆弱的 我将如何将用户密码从一种哈希类型迁移到
  • 如何注释 EJS 代码(JS 节点)而不出现错误

    我在 EJS 文件中有以下代码 table tr td td td td tr table 当我这样评论的时候
  • 获取数字的 CastError NaN

    我收到这个错误 CastError Cast to Number failed for value NaN at path area message Cast to Number failed for value NaN at path a
  • 带有 CSS 的纹理文本?

    我目前正在开发一个简单的页面 有谁知道有什么方法可以将纹理图像覆盖在文本上吗 目前的规格似乎不可能 但请告诉我这是否可能 谢谢并保重 不知道为什么没有人回答这个问题 这可以使用background clip https codepen io
  • 指定 Tkinter 文本框的尺寸(以像素为单位)

    如何使用像素指定 Tkinter 文本框的尺寸 我不想改变字体大小 我用它来帮助我将其缩放到窗口的大小 您可以通过将其放入框架内 通过停用尺寸传播并配置条目以粘贴到框架边框来强制框架为固定尺寸来实现此目的 pack 也应该以类似的方式工作
  • 屏幕上和变量中的调用表达式输出

    我正在尝试存储来自的输出Invoke expression到变量以及屏幕上 我有 PS 日志记录 它会自动将所有内容记录为Write Host在一个文件中 现在我正在使用Invoke Expression这似乎要么在屏幕上打印输出 要么打印
  • 对 pandas MultiIndex 数据帧进行重新采样

    我有一个类似于以下内容的 pandas MultiIndex 数据框 import pandas as pd rows One One One 20120105 1 Text1 One One One 20120107 2 Text2 On
  • swift ios 键盘扩展 - 长按/按住

    我需要知道如何向 ios 自定义键盘扩展添加长按 按住 功能 以便我可以显示多个键以从中选择一个 expected design 我的项目结构 按键操作的当前代码 代码可以将按下的按钮的标题作为新文本添加到任何代理文本字段中 IBActio
  • Xcode PhoneGap 本地化

    这两天我一直在努力尝试向我的应用程序添加特定于语言的本地化 该应用程序正在使用 PhoneGap 1 1 我正在尝试使用 XCode 4 1 构建它 两天以来我一直在寻找信息 教程 其他内容 但找不到任何详细信息 所以 要么这是一个微不足道
  • XStream解析没有根节点的JSON

    我目前正在使用 XStream 反序列化 JSON 并且效果很好 但是 当我有如下所示的 JSON 字符串时 key1 an object something foobar key2 another object data hi 最值得注意
  • 在哪里放置模型数据和行为? [tl;博士;使用服务]

    我正在使用 AngularJS 来完成我的最新项目 在文档和教程中 所有模型数据都放入控制器范围内 我知道它必须可供控制器使用 因此必须在相应的视图中 但我认为该模型实际上不应该在那里实施 例如 它可能很复杂并且具有私有属性 此外 人们可能
  • 将文本框绑定到comboBox.SelectedItem 的属性

    我正在使用 winforms 并且有一个代表 IQueryable 的组合框 组合框下方是一系列文本框 我希望将它们绑定到组合框中当前选择的文本框 这是我的代码 public partial class TestForm Form publ
  • 如何访问 keras 中单个自定义损失函数的所有输出

    我正在尝试重现中提出的网络架构本出版物 https www sciencedirect com science article pii S0031320319302031在张量流中 作为一个完全的初学者 我一直在使用本教程 https ww
  • 如何在使用 Component Creator 构建的 Joomla 3.x 组件的一个视图中包含多个模型

    Joomla 组件使用 MVC 模型 Component Creator 是一种广泛使用的工具 其付费级别支持通过 SQL 导入创建多表视图 此外 开发人员根据 Joomla 文档从头开始构建组件 我想构建一个高级组件 充当 仪表板 显示来
  • Python:从字符串中提取多个浮点数

    请原谅我 我是 Python 新手 给定一个以不确定长度的浮点数开头并以相同长度结尾的字符串 我如何将它们都提取到一个数组中 或者如果只有一个浮点数 则只有一个 例子 38 00 SALE 15 20 69 99 我想返回 38 00 15
  • 计算 AP 的距离,包括信噪比

    出于某种原因 我和一个朋友正在讨论根据从设备获取的信息 RSSI 频率 SNR 等 计算您自己 笔记本电脑 手机等 与 AP 之间的距离 因此 在花了一些时间研究三边测量 三角测量和自由空间路径损耗之后 在一些博客文章和 wiki 的帮助下
  • bootstrap-affix :affix 下面的 Div“跳”到顶部。如何让它平滑地向后滚动?

    已经使用 bootstrap 几天了 并对它提供的功能感到惊讶 一直在尝试拥有某种 标题 当用户向下滚动时将其固定在顶部 您可以在这里找到我当前的工作 http mp3dj free fr affix site http mp3dj fre
  • 比较 SynchronizationContext

    如何比较 SynchronizationContext 看来同一个Dispatcher在使用BeginInvoke时可以创建不同的SynchronizationContext 当我深入研究两个 不相等的 上下文时 我发现调度程序线程 ID