WPF线程和GUI如何从不同线程访问对象?

2024-01-06

我有一个线程调用一个从互联网获取一些东西的对象。当该对象填满所需的所有信息时,它会引发一个事件,其中对象将包含所有信息。该事件由启动线程的控制器消耗。

然后,从事件返回的对象被添加到通过视图模型方法绑定到 GUI 的集合中。

问题是我无法将 CheckAccess 与绑定一起使用...如何解决使用从主线程的其他线程创建的对象的问题?

当我将对象添加到主线程集合时收到的错误是:

这种类型的 CollectionView 不支持从与 Dispatcher 线程不同的线程更改其 SourceCollection。

这是控制器:

public class WebPingerController
{
    private IAllQueriesViewModel queriesViewModel;

    private PingerConfiguration configuration;

    private Pinger ping;

    private Thread threadPing;

    public WebPingerController(PingerConfiguration configuration, IAllQueriesViewModel queriesViewModel)
    {
        this.queriesViewModel = queriesViewModel;
        this.configuration = configuration;
        this.ping = new Pinger(configuration.UrlToPing);
        this.ping.EventPingDone += new delPingerDone(ping_EventPingDone);
        this.threadPing = new Thread(new ThreadStart(this.ThreadedStart));
    }


    void ping_EventPingDone(object sender, QueryStatisticInformation info)
    {
        queriesViewModel.AddQuery(info);//ERROR HAPPEN HERE
    }

    public void Start()
    {
        this.threadPing.Start();
    }

    public void Stop()
    {
        try
        {
            this.threadPing.Abort();
        }
        catch (Exception e)
        {

        }
    }

    private void ThreadedStart()
    {
        while (this.threadPing.IsAlive)
        {
            this.ping.Ping();
            Thread.Sleep(this.configuration.TimeBetweenPing);
        }
    }
}

我找到了解决方案blog http://blog.guymahieu.com/2006/11/15/systemdelegate-is-not-a-delegate-type/.

而不是仅仅调用集合来从线程中添加对象。

queriesViewModel.AddQuery(info);

我必须将主线程传递给控制器​​并使用调度程序。警卫的回答非常接近。

    public delegate void MethodInvoker();
    void ping_EventPingDone(object sender, QueryStatisticInformation info)
    {
        if (UIThread != null)
        {

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

WPF线程和GUI如何从不同线程访问对象? 的相关文章

  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • WPF 从主线程以外的其他线程截屏

    我有一个线程用于侦听 WPF 应用程序的命令 如果 WPF 应用程序收到截取屏幕截图的命令 则任务将移交给 screenshotService 我在互联网上的某个地方找到了一些代码来截取屏幕截图 似乎可以工作 但我还没有想清楚 我无法从另一
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 四边形网格划分库

    我试图找到一个用 C 编写的网格划分库 仅使用四边形网格对自定义形状进行网格划分 这是我正在寻找的算法 代码的示例 但这不是免费的并且是用 ANSI C 编写的 http members ozemail com au comecau qua
  • RxJS5 TypeScript 打字失败

    I run tsc在我的项目中 我收到与 RxJS5 库相关的这些错误 tsc node modules rxjs observable FromEventObservable d ts 11 39 error TS2304 Cannot
  • PHP/HTML/CSS - 如果是 FireFox,是 Chrome,还是 Safari

    是否有简单的条件语句 css命令 html jquery javascript或简单的PHP动态方法来检测当前浏览器 element top 4px element top 6px element top 8px element top 1
  • 访问 ASM Java 库中的局部变量

    我试图在插入方法时调用局部变量 到目前为止 我能够获取节点中的局部变量 但在实际访问任何内容时遇到困难 这是我的插入内容 非常杂乱 我已经这样做了一段时间 设计不再是我的首要任务 不久前 final ClassReader reader n
  • Spring防止ajax调用成为身份验证时的目标url

    我有一个正在运行的 Spring Java Web 应用程序 在某些页面上 当我注销时 最后发出的请求是 AJAX 调用 因此 当我重新登录时 Spring 将我重定向到 ajax 调用 给我一个充满 json 的浏览器 我的登录成功处理程
  • 包含敏感数据的私有和公共 Git 存储库

    我当前正在运行一个服务Heroku https www heroku com Heroku 的部署方式是将代码推送到 git 存储库 这会触发构建并随后触发新代码的部署 由于这是将服务部署到 Heroku 的唯一方法 因此该 git 存储库
  • Windows 8 XAML 多列文本

    Is there a way to make columns in a text I have one big string with the text i have to display and i have a fixed height
  • 如何在 Jetpack Compose 中添加边距?

    您究竟如何添加保证金Jetpack Compose 我可以看到有一个Modifier用于填充Modifier padding 但我似乎找不到一个利润 还是我瞎了 请有人指导我 非常感谢 您可以将填充和边距视为同一件事 将其想象为 间距 填充
  • 重叠部分透明元素的不透明度

    如果你有 div 不透明度为 0 5 的元素和另一个 div 元素以相等的不透明度覆盖第一个元素 那么两个元素加在一起的不透明度是多少 它不是 5 5 也不是 5 5 遇到这样的问题我该如何计算呢 我相信您正在寻找的公式是 1 x y di
  • 当文件名大小写改变时如何切换分支?

    我有一个分行development有一个文件Config json 我正在创建一个新分支new development 我重命名的地方Config json to config json并承诺 我切换回development看看那个分支中的
  • Acumatica 中动态变化的 PXSelector

    我有以下用例 Acumatica 组合框 下拉列表 可以有 8 个左右的值 其选择决定了用于在 PXSelector 中呈现的表 DAC e g 如果用户选择选项 a 我需要在表 A 中的 PXSelector 值中显示 如果用户选择选项
  • 如何修补 Eigen 3.3.7 以解决 GCC 8.2.1 错误(arm-none-eabi 8-2018q4-major 工具链)?

    我试图用以下命令编译 Eigen 3 3 7Arm的裸机8 2018q4 major工具链 https launchpad net gcc arm embedded announcement 15181并看到完全相同的错误 请参阅x86 6
  • 如何每天自动运行带有Python代码的Jupyter笔记本?

    我在 Jupyter 笔记本中有一些 Python 代码 我需要每天自动运行它 所以我想知道是否有办法进行设置 我真的很感谢对此的任何建议 Update最近我遇到了 papermill 它用于执行和参数化笔记本 https github c
  • music21:解析每首曲目的音符和持续时间

    我正在尝试使用 music21 将多轨 MIDI 文件转换为每个轨道的音符和持续时间数组 例如 给定一个包含 16 首曲目的 MIDI 文件 test mid 我想要获得 16 个元组数组 其中包含 音高 持续时间 加上音符的位置 musi
  • 在javafx中过滤要从数据库显示的数据

    我想在表视图中仅显示某些信息 例如数据库中仅显示 男性 人员 我只擅长使用javafx 提前感谢您的帮助 This is my current table 我想过滤表 以便表中仅显示具有 订单状态 已付款 的行 如果您可以使用 java 8
  • 如何使用维基词典 API 获取发音数据? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我一直在寻找一种通过查询某种 API 来获取任何给定单词的发音的方法 作为维基词典 http en w
  • 注册表项更改与 Python winreg 不生效,但不引发错误

    对 Python 来说还是个新手 我正在尝试编写一个脚本 允许我更改远程计算机上的特定注册表项 但我遇到了一些麻烦 基本上我的代码运行没有错误 但键值也没有设置 我使用在目标计算机上具有管理员权限的帐户 以管理员身份从 Windows 命令
  • 使用 Python 请求将文件数据放入 Autodesk API

    我正在按照描述的过程进行操作here https developer autodesk com en docs data v2 tutorials upload file 但被一个人拦住了403在第 4 步 我有一个令牌data write
  • GCC优化技巧,真的有效吗?

    在查看一些有关优化的问题时 这接受的答案 https stackoverflow com questions 2074099 coding practices which enable the compiler optimizer to m
  • WPF线程和GUI如何从不同线程访问对象?

    我有一个线程调用一个从互联网获取一些东西的对象 当该对象填满所需的所有信息时 它会引发一个事件 其中对象将包含所有信息 该事件由启动线程的控制器消耗 然后 从事件返回的对象被添加到通过视图模型方法绑定到 GUI 的集合中 问题是我无法将 C