从BackgroundWorker线程更新图像UI属性

2024-06-02

在我正在编写的 WPF 应用程序中,我有一个 TransformedBitmap 属性,该属性绑定到 UI 上的 Image 对象。每当我更改此属性时,图像就会更新(因此显示在屏幕上的图像也会更新)。为了防止在检索下一张图像时 UI 冻结或变得无响应,我尝试使用 BackgroundWorker 进行快照检索,如下所示:

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
  e.Result = this.snapshotHelper.GetSnapshot(ImageFormat.Bmp);
}

然后,在我的 RunWorkerCompleted 方法中,我有以下内容:

private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
  this.CurrentImage = (TransformedBitmap)e.Result;
  ....
}

这似乎工作正常,直到使用 INotifyPropertyChanged 方法来告诉 Image 对象在我更新 Current Image 属性时进行更新;我收到跨线程错误。

public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
  if (PropertyChanged != null)
  {
  //The following causes a "the calling thread cannot access this object because a different thread owns it" error!
    PropertyChanged(this, new PropertyChangedEventArgs(info));      
  }
}

我真的不知道如何改变周围的情况,也不知道如何采取不同的措施来解决此错误。在过去的几个小时里,我一直在阅读有关BackgroundWorkers的内容,在我看来,我应该能够在RunWorkerCompleted方法中很好地设置CurrentImage;至少据我所知。对此的任何帮助将不胜感激!谢谢!


Dispatcher.Invoke((Action<TransformedBitmap>) (obj => this.CurrentImage = obj), e.Result as TransformedBitmap);

这应该有效...

Update

在您的情况下,您使用的是可冻结对象,问题在于您创建的位图需要在 UI 线程中发送之前冻结。所以你的DoWork将如下所示:

void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            var bmp = snapshotHelper.GetSnapshot(ImageFormat.Bmp);
            bmp.Freeze();
            e.Result = bmp;            
        }

然后在 RunWorkerCompleted 中,按照我上面写的那样更新属性。

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

从BackgroundWorker线程更新图像UI属性 的相关文章

  • Qt:如何制作二维插值颜色字段?

    我是 C 的初学者 尤其是与图形相关的 我想为我的图形视图制作一个动画背景 如下所示 梯度场气流 http www engineering leeds ac uk cfd research images untitled JPG 该图片表现
  • 使用不同版本的 Visual Studio 创建的 C++ 库是否相互兼容?

    我正在使用 Visual Studio 2005 创建一个开源 C 库 我想提供预构建的库以及源代码 这些使用 VS2005 构建的库是否也适用于较新版本的 Visual Studio 尤其是 VS Express Edition 2008
  • 我以前从未见过的奇怪的 xCode 链接器错误说“断言失败”

    通过Unity构建了这个游戏 并通过xCode成功编译过一次 然而 如果没有任何明显的变化 就会出现此错误消息 我不明白从哪里开始寻找解决方案 但也许其他人有线索 我通过搜索看到了类似的错误 尽管与我的相比 这些修复似乎是任意的 有人能透露
  • 如何编写基于线程的并行列表迭代?

    我需要一个如何使用 ocaml 线程编写并行 iter 函数的示例 我的第一个想法是有一个与此类似的函数 let procs 4 let rec part part i lst match lst with gt hd tl gt let
  • ASP.NET身份用户登录后为空

    Edit 1 更新代码以更好地处理这个问题后 我现在遇到了以下问题 提供的防伪令牌适用于与当前用户不同的基于声明的用户 这是更新后的代码 var result await SignInManager PasswordSignInAsync
  • 如何从不同的进程关闭窗口

    我有一个 C 应用程序 我想指示它从不同的进程中很好地关闭 我还希望能够要求它打开主窗口 我有一个对其主窗口句柄的引用 我知道我可以使用远程处理或 WCF 等复杂的方案来做到这一点 问题是我可以使用更简单的机制 例如窗口消息 或 c 应用程
  • Marshal.PtrToStructure() 和结构 DEVMODE 中的字符数组出现问题

    我在使用 Marshal PtrToStructure 从指向 DEVMODE 类型结构的指针中提取数据时遇到问题 Here http msdn microsoft com en us library dd183565 28v vs 85
  • 编译器优化 - 函数没有地址

    我没有使用太多指向成员函数的指针 但我认为在使用此类指针时发现了一些危险的情况 当编译器由于某些优化而决定不为函数分配地址时 就会出现问题 VS 2015 即使在调试 x86 中也会发生这种情况 禁用优化 Od 我正在重构一个旧系统 将一些
  • 为什么 -Winit-self 与 -Wuninitialized 分开

    这个问题 https stackoverflow com q 22963405 10396是关于让 gcc 编译器在您输入错误并用自身初始化变量时发出警告 int f int i i return i 事实证明你需要 Winit self
  • 如何为字符串生成唯一的哈希码

    是否有任何函数可以为相同的字符串提供相同的哈希码 我在创建 2 个不同的字符串 但内容相同 时遇到麻烦 它们的哈希码不同 因此未在Dictionary 我想知道什么GetHashCode 函数Dictionary当键是字符串时使用 我正在这
  • 如何使用Dapper获取存储过程的返回值?

    我在 asp net mvc 4 项目 net f w 4 6 1 中使用 Dapper 使用 sql server 2016 Express
  • 在数据网格中绑定枚举属性的最佳方法

    将枚举属性绑定到数据网格的最佳方法是什么 当前我正在使用公共属性并从那里返回枚举名称还有其他方法吗 枚举 public enum enStatus Draft 1 Published 2 Started 3 Completed 4 Mode
  • 指针类型与 PyArray_SimpleNew 不匹配

    我正在使用 C API 使用 Numpy 创建 Python 模块 并遇到与输出的奇怪的不兼容问题PyArray SimpleNew 我想了解一下 但首先是一个最小的例子 include
  • 自动将 c++ dll 包装到 c# 中

    我想在 C 项目中使用 C 库 是否有任何包装工具可以自动导入所有类 SWIG http www swig org 可以帮助创建一个由两部分组成的包装器 一侧为 C 一侧为 C 不过 设置正确的生成文件需要一些工作 另一种需要更多手动编码的
  • 将固定长度的数据从 std::istream 复制到字符串

    我想将固定长度的数据从 std istream 复制到字符串 std istream operator gt gt std istream is LogMsg msg read in 4 bytes a uint32 t that desc
  • C# 中带有复选框的 TreeView

    我在 C 中有一个带有复选框的树视图 我希望当用户检查一个节点时 自动检查以下级别上的所有节点 有谁知道如何做到这一点 而无需在每次用户检查某个节点时在所有树上运行递归功能 Thanks 该函数返回树视图 public TreeView G
  • 如果我有一个在标签之后初始化的变量,为什么我会收到“标签只能是语句的一部分,声明不是语句”? [复制]

    这个问题在这里已经有答案了 我有以下简化代码 include
  • FlowLayoutPanels 中的 C# 拖放标签

    我有一个小问题 我想要制作一个程序 可以在多个 FlowLayoutPanel 之间拖动生成的标签 但最近几天我尝试让拖放工作 我尝试了很多教程 示例等 但总是有些不同 而且我无法仅提取基本代码 它类似于这个程序 https social
  • 使用 Roslyn 语义模型在单个 .cs 文件中查找符号

    我正在使用 Roslyn 创建一个分析器 如果特定类以不同步的方式公开其字段 该分析器会向用户发出警告 以帮助防止竞争条件 问题 我目前有工作代码可以检查以确保字段是私有的 我在解决最后一个难题时遇到了麻烦 找出一种方法来确保所有字段只能在
  • XPS 文件中打印的重复图像

    首先 我想指出 我已将此作为错误向 Microsoft 提出 但他们目前不愿意修复它 我正在寻找一种解决方法或更好的方法来实现我想要做的事情 因为我们的客户认为这是一个相当重要的问题 The code 主窗口 xaml

随机推荐

  • 安全地评估简单的数学

    我想知道是否有一种安全的方法来评估数学 例如 2 2 10000 12000 10000 20 2 2 40 20 23 12 无需使用eval 因为输入可以来自任何用户 我需要实现的只是整数的加法和减法 是否有任何已经存在的代码片段 或者
  • Google Apps OpenID 网址

    Problem 我的组织 ExampleFooBar 使用 Google Apps 在我们的网站上我想要 启用 OpenID 单点登录 如 StackOverflow 但只允许 examplefoobar com 用于登录的电子邮件地址 我
  • tomcat-maven-plugin 使用 Tomcat 7 - tomcat:deploy 有效,tomcat:undeploy 无效

    我有一个 tomcat deploy 的工作配置 但是当我取消部署 WAR 时 出现以下错误 这让我很困惑 INFO Scanning for projects WARNING WARNING Some problems were enco
  • ValueError:无法插入 ID,已存在

    我有这个数据 ID TIME 1 2 1 4 1 2 2 3 我想按以下方式对数据进行分组ID并计算每组的平均时间和规模 ID MEAN TIME COUNT 1 2 67 3 2 3 00 1 如果我运行此代码 则会收到错误 ValueE
  • 如何从图库动态卸载图像?

    我有自定义 ImageView public class ShadowedImageView extends ImageView private Paint mPaint public Bitmap bitmap null private
  • MySQL 选择第一个字符在哪里

    如何选择单元格的第一个字符并使用它来定义返回的内容 看看MySQL 字符串 和 控制流 功能 http dev mysql com doc refman 5 1 en functions html 例如 SELECT IF LEFT myF
  • Riverpod - ref.refresh。应该使用“刷新”的值

    我正在将 Riverpod 与 flutter 一起使用 在我的主屏幕上 我有一个 FutureProvider 它调用 API 服务器 并在页面上显示结果 在应用程序的不同点 不同屏幕上的用户进行更改 然后我从另一个屏幕刷新提供程序 像这
  • 如何在 ODOO 10 中从销售订单创建交货订单?

    在销售应用中 确认报价时根据销售订单创建的库存交货单在哪里 ODOO10 的工作流程中调用了哪些函数 当我无法跟踪回溯时 这是我使用的一个有用的技巧 您说过您想知道交货单是在哪里创建的 不是吗 因此 由于交货单是出货拣货 您可以在代码中编写
  • 使用具有抗锯齿功能的 C# 更改抗锯齿图像的背景颜色

    我有一个图像需要更改背景颜色 例如 将下面示例图像的背景更改为蓝色 然而 图像是抗锯齿的 所以我不能简单地用不同的颜色替换背景颜色 我尝试过的一种方法是创建第二个图像 仅作为背景 并更改其颜色并将两个图像合并为一个图像 但是这不起作用 因为
  • select2 验证 - 选择至少一个值

    我在用select2 http ivaynberg github io select2 and jQuery 验证 http jqueryvalidation org 插件 select2 的 HTML div class form gro
  • Blazor 中有没有办法将 wasm-function(#) 反向映射回 c# 方法?

    我正在 Chrome 上运行 Blazor 页面 从 Chrome 分析器中看到它在代码 wasm function 633 上花费了大量时间 有什么办法让我知道这对应于什么c 代码吗 我想提高页面的性能 这将有助于在更改任何代码之前了解导
  • 引用/指针失效到底是什么?

    我找不到任何定义指针 引用无效在标准中 我问这个问题是因为我刚刚发现 C 11 禁止字符串的写时复制 COW 据我了解 如果应用了 COW 那么p仍然是一个有效的指针并且r以下命令后的有效参考 std string s abc std st
  • 为什么 Cdecl 调用在“标准”P/Invoke 约定中经常不匹配?

    我正在开发一个相当大的代码库 其中 C 功能是从 C P Invoked 的 我们的代码库中有很多调用 例如 C extern C int stdcall InvokedFunction int 使用相应的 C DllImport CPlu
  • 检查 Ruby 上的浏览​​器控制台输出

    如何检查浏览器控制台是否有错误 例如 我用 Selenium 启动了浏览器 firefox 的 chrome 并且用 Selenium WebDriver 做了一些操作 之后我想知道网络控制台中是否有任何错误 我尝试接受控制台错误 例如 d
  • GL_COLOR_ATTACHMENT 有什么作用?

    我现在正在学习帧缓冲区 但我只是不明白颜色附件的作用 我了解帧缓冲区 第二个参数的意义是什么 glFramebufferTexture2D GL FRAMEBUFFER GL COLOR ATTACHMENT0 GL TEXTURE 2D
  • 如何连接以逗号分隔的命名范围的返回值

    我花了几个小时试图找出如何连接命名范围中的返回值 但结果是 运行时错误 32 类型不匹配 作为一个新手 我仍在与数组作斗争 所以也许我忽略了一些细节 谢谢你帮助我 示例 B1 苯 B2 柴油 B3 混合动力 gt E1 汽油 E2 柴油 E
  • 在 Tkinter 中使用锚点

    我正在尝试对自动点唱机进行编程 但是我还处于早期阶段 并且在使用时遇到了问题anchor 这是我的代码 from tkinter import from tkinter import messagebox as box def main m
  • 如何使用 NPOI 按地址(A1、A2)获取 Excel 单元格值

    我有一个 Excel 单元格地址 例如 A1 A2 如何使用 C 中的 NPOI 框架以编程方式访问此单元格 我找到的一些 Java POI 示例代码 CellReference cr new CellReference A1 row my
  • 与 White 的集成测试[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 有人有白色框架的经验吗 www co
  • 从BackgroundWorker线程更新图像UI属性

    在我正在编写的 WPF 应用程序中 我有一个 TransformedBitmap 属性 该属性绑定到 UI 上的 Image 对象 每当我更改此属性时 图像就会更新 因此显示在屏幕上的图像也会更新 为了防止在检索下一张图像时 UI 冻结或变