WPF 和 NotifyPropertyChanged 来自不同的线程

2023-12-11

我对 WPF 非常有经验,但有一件事困扰着我。我正在使用 ReactiveUI 引发 INotifyPropertyChanged 事件。我有两个类似的地方:

 public UiModel UiModel
            {
                get { return _uiModel; }
                set { this.RaiseAndSetIfChanged(ref _uiModel, value); }
            }

    public void Run()
    {
      UiModel = GetUIModel();
    }

where Run()是这样称呼的await Task.Run(()=>Run()); and UiModel绑定在XAML。 那么基本上应该发生什么 -> 它应该抛出一个跨线程异常,如果Run()函数在不同的线程上调用,不是吗?我在代码中有两个地方,在一个地方它总是抛出异常,在第二个地方永远不会抛出异常。我比较了两个地方的线程 IDRun()不在 UI 线程上运行。为什么会这样呢? 在不抛出异常的地方,我将其绑定到 UserControl 中的依赖属性,然后使用普通绑定将其绑定

抛出异常:{"The calling thread cannot access this object because a different thread owns it."}

看起来我已经找到了这种具体情况的答案。 UiModel 及其绑定不会抛出异常,但 UiModel 也用于 ReactiveUI 验证。如果我不从 UI 更新它,它将尝试从导致该异常的不同线程更新 CanExecuteChanged。尽管如此,我的问题仍然是一样的 - 为什么我可以从不同的线程更新 UI 而不会出现跨线程异常?我在 ReactiveUI PropertyChanged 调用中看不到调度程序调用。


该领域存在一些令人烦恼的不一致之处。以下是您可以和不能从工作线程执行的操作的列表。

引发跨线程异常:

  • 修改一个DependencyProperty在控制上
  • 提高ICommand.CanExecuteChanged event
  • 提高INotifyCollectionChanged.CollectionChanged事件,通常来自以下实例ObservableCollection<T>

不抛出异常:

  • 提高INotifyPropertyChanged.PropertyChanged事件,通常来自视图模型绑定

我确信 WPF 不自动调用第一个列表是有充分理由的,但我想不出它可能是什么。

我的处理建议服务活动 are:

  1. 维护对a的引用SynchronizationContext从 UI 线程捕获(这里可能对您来说最常用)。
  2. 使用中介服务在 UI 线程上调用应用程序事件处理程序
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF 和 NotifyPropertyChanged 来自不同的线程 的相关文章

随机推荐

  • 如何使用 jQuery 将类添加到 Body 标记?

    让我澄清我的问题以及我正在寻找的解决方案 我正在使用 wikispaces com 我想使用 jQuery 动态地为每个页面添加一个唯一的主体类 以某种方式获取 URL 然后插入专门应用于该页面的唯一主体类 所以 这是我的维基空间中的示例网
  • 从 MySQL 数据库的所有表中删除所有零日期

    我在 MySQL 中有很多表 其中 dateTime 列中包含零日期0000 00 00 00 00 00 使用某种管理设置 是否可以禁用零日期并用静态值替换所有零1 1 1900 EDIT 我正在从事数据库迁移工作 涉及将 100 多个
  • Silverlight 中的跨域安全错误?

    我正在尝试将 Yahoo Pipes 的提要读入 Silverlight 应用程序 我不断收到 SecurityException 这听起来像是跨域策略问题 但是雅虎管道 如果您通过 Pipes yahooapis 域 则具有跨域策略 所以
  • 为什么我的多维数组初始化不起作用?

    出于某种原因 在 IntelliJ 中 如果这很重要 当我尝试初始化 2D 数组时 只有第一个框会根据我指定的大小进行初始化 IE int grid new int 9 9 当我运行调试器时 它显示我已经创建了一个数组int 9 有谁知道我
  • 如何将数据从 iCloud 存储文件迁移到本地存储中的新存储文件?

    I have iCloud在我的应用程序中 我已经删除了iCloud从我的应用程序 但在 ios 6 应用程序崩溃 我收到此消息 NSPersistentStoreCoordinator addPersistentStoreWithType
  • 将 app.config 与类库一起使用

    我经常需要创建一个 Net 类库 它需要 app config 来存储数据库连接字符串等内容 但是 这些设置必须位于调用应用程序的 app config 或 web config 中 如果我想跨多个应用程序分发 DLL 这会变得很痛苦 因为
  • 将多行环境变量拆分为几行

    我有以下问题 我在 Jenkins 服务器上执行 Windows 批处理文件 并且必须将多行环境变量 通过 Jenkins 参数设置 拆分为单行 每一行都是另一个程序的参数列表的一部分 Jenkins 文本框参数 foo 224 bar S
  • xtable 的颜色代码单元格

    我用过 R sweave 但是notknit 和 xtable 创建一个表 其中 1 列是标识符 其他三列是 标志 列 它们要么为空 要么包含 1 标志 我希望能够对最后三列进行着色 以便每个单元格要么是绿色 如果为空白 要么是红色 如果包
  • 无法使用 Vitamio 进行直播

    我正在尝试使用Vitamio要运行 RTSP 视频流 我在更新 Vitamio sample 后使用它来运行流VideoViewDemo活动 public class VideoViewDemo extends Activity TODO
  • Hadoop 流命令失败并出现 Python 错误

    我是 Ubuntu Hadoop 和 DFS 的新手 但我已经按照 Michael Noll com 上发布的说明成功在本地 ubuntu 计算机上安装了单节点 hadoop 实例 http www michael noll com tut
  • Html.Hidden 字段未设置

    我的视图中有一个隐藏字段 如下所示 using Html BeginForm Action Schedule Html Hidden Id Model Schedule Id 以及一个接受如下信息的操作方法 public ActionRes
  • 如何在C中读取或捕获Ctrl+某个键或Alt+某个键?

    For example I want to do some thing when some combination of Ctrl key with any other key is pressed or it may be Alt key
  • 忽略 TextField SwiftUI 组合中输入中的左侧空格

    我正在传递给 TextField 发布的变量 TextField First name text state firstName 我想控制估算 如果从左侧输入 则忽略空格 我可以在哪里以及如何做 可以使用代理绑定来完成 如下所示 TextF
  • 在 Mercurial 中指定编辑器

    一般来说 如果我有一个 W 类型的自定义文件 并且想要使用自定义应用程序 编辑器 X 打开 查看它 当我想要编辑 查看该文件时 如何设置 Hg 来调用应用程序 X 具体示例 我使用 TortoiseHg 来跟踪一组文件 这些文件是由自定义应
  • 可以观察到分组和去抖动吗?

    我有一个可观察的对象 它发出一个包含一些参数的对象 在对象中 参数之一 称为optionId 明确标识一个选项 我想消除该发射的所有实例 然而 如果一个新的optionId出现 我想启动一个新的时钟 并开始一个新的反跳 这是我正在寻找的示例
  • 如何在 Swift 中创建自定义 getter 方法?

    我正在尝试使用以下代码为我的属性创建自定义设置方法 var myProperty String get if CONDITION1 return CONDITION1 STRING else if CONDITION2 return CON
  • “adb install”返回错误:协议错误(无状态)

    我已经创建并运行了几个 Android 模拟器 现在我想在它们上安装应用程序 这是我多次尝试的故事 adb s emulator 5562 install xxx apk daemon not running starting it now
  • 标题大写

    我正在尝试编写一种将标题大写的方法 它不应将每个单词都大写 而应仅将大单词大写 如果您愿意的话 有时 它必须将每个单词大写 也许我需要为这些小词添加一个例外 这是 Ruby 教程的一部分 我无法使用 Railstitleize方法 这是我到
  • R - 使用 par() 创建 ggplot 绘图网格 - 未按预期工作[重复]

    这个问题在这里已经有答案了 我有一些数据看起来像这样 Generate example data exampleData lt data frame Month sample 1 5 500 replace T Product sample
  • WPF 和 NotifyPropertyChanged 来自不同的线程

    我对 WPF 非常有经验 但有一件事困扰着我 我正在使用 ReactiveUI 引发 INotifyPropertyChanged 事件 我有两个类似的地方 public UiModel UiModel get return uiModel