在 C# 中异步加载图像

2024-03-01

我正在开发一个 C# WPF 应用程序,它加载大量图像并将其显示为缩略图。我想以多线程的方式来做。因此我尝试实现一个BackgroundWorker。

BackgroundWorker的DoWork()的代码:

string[] files = e.Argument as string[];
foreach (string file in files)
{
    ImageModel image = new ImageModel();
    image.FilePath = file;
    _importWorker.ReportProgress(1, image);
    _imageCollectionVM.Images.Add(image); // also tried this one in ReportProgress()
}

在我的 XAML 代码中,我绑定到 ImageModel 的 BitmapImage 属性。 (AsyncState=True 没有帮助。)这里我收到此错误:“DependencySource”和“DependencyObject”必须位于同一线程中。

<Image Source="{Binding BitmapImage}" />

如果我注释掉这一点,图像似乎已导入,但我无法访问它,例如通过在 ListView 中选择它。在其 SelectionChanged 中,它表示该对象已被另一个线程占有。

我该如何解决这些问题?提前致谢!


您必须将对 GUI 的更新编组到主线程。基本上,您只能多线程从磁盘加载图像,但 GUI 的实际更新必须以单线程完成。

有很多方法可以做到这一点,并且 stackoverflow 上的许多问题都解决了这个问题。这里有一些可以帮助您入门的内容

从后台线程更新 UI https://stackoverflow.com/questions/7959005/update-ui-from-background-thread

从后台线程更新 BindingList? https://stackoverflow.com/questions/3587032/update-bindinglist-from-a-background-thread

从后台 C# 线程更新 pictureBox 是邪恶的吗? https://stackoverflow.com/questions/6527825/is-it-evil-to-update-a-picturebox-from-a-background-c-sharp-thread

如何为此使用 BindingList

如何从后台线程正确更新数据绑定 datagridview https://stackoverflow.com/questions/455766/how-do-you-correctly-update-a-databound-datagridview-from-a-background-thread

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

在 C# 中异步加载图像 的相关文章

  • 是否可以使用 http url 作为 DirectShow .Net 中源过滤器的源位置?

    我正在使用 DirectShow Net 库创建一个过滤器图 该过滤器图通过使用 http 地址和 WM Asf Writer 来流式传输视频 然后 在网页上 我可以使用对象元素在 Windows Media Player 对象中呈现视频源
  • Selenium - C# - Webdriver - 无法找到元素

    在 C 中使用 selenium 我试图打开浏览器 导航到 Google 并找到文本搜索字段 我尝试下面的 IWebDriver driver new InternetExplorerDriver C driver Navigate GoT
  • 防止控制台应用程序中的内存工作集最小化?

    我想防止控制台应用程序中的内存工作集最小化 在Windows应用程序中 我可以这样做覆盖 SC MINIMIZE 消息 http support microsoft com kb 293215 en us fr 1 但是 如何在控制台应用程
  • 混合模型优先和代码优先

    我们使用模型优先方法创建了一个 Web 应用程序 一名新开发人员进入该项目 并使用代码优先方法 使用数据库文件 创建了一个新的自定义模型 这 这是代码第一个数据库上下文 namespace WVITDB DAL public class D
  • if constexpr 中的 not-constexpr 变量 – clang 与 GCC

    struct A constexpr operator bool const return true int main auto f auto v if constexpr v A a f a clang 6 接受该代码 GCC 8 拒绝它
  • C# 根据当前日期传递日期时间值

    我正在尝试根据 sql server 中的两个日期获取记录 Select from table where CreatedDate between StartDate and EndDate我通过了5 12 2010 and 5 12 20
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 测量进程消耗的 CPU 时钟

    我用 C 语言编写了一个程序 它是作为研究结果创建的程序 我想计算程序消耗的确切 CPU 周期 精确的循环次数 知道我怎样才能找到它吗 The valgrind tool cachegrind valgrind tool cachegrin
  • 如何在多线程应用程序中安全地填充数据并 Refresh() DataGridView?

    我的应用程序有一个 DataGridView 对象和一个 MousePos 类型的列表 MousePos 是一个自定义类 它保存鼠标 X Y 坐标 类型为 Point 和该位置的运行计数 我有一个线程 System Timers Timer
  • SQLAPI++ 的免费替代品? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何免费 也许是开源 的替代品SQLAPI http www sqlapi com 这个库看起来
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • 在 C# 的 WebAPI 中的 ApiController 上使用“传输编码:分块”提供数据

    我需要服务分块传输使用编码数据API控制器 因为我无权访问HttpContext or the Http请求 我有点不知道在哪里写入响应以及在哪里刷新它 设置如下 public class MyController ApiControlle
  • GCD 与自定义队列

    我想知道这两者的性能有什么区别 dispatch async dispatch get global queue DISPATCH QUEUE PRIORITY HIGH 0 perform complex operation dispat
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • 如果将变量设置为等于新对象,旧对象会发生什么?

    假设我们有一个 X 类not有一个超载的operator 功能 class X int n X n 0 X int n n n int main X a 1 an object gets constructed here more code
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调

随机推荐

  • Visual Studio 2010 XAML 编辑器尴尬的 IntelliSense?

    在 Visual Studio C 文本编辑器中 当您需要属性时 只需键入prop然后点击两次选项卡即可获取属性的 片段 模板 类型和属性名称都会突出显示 当您想要在类型和属性之间切换时 请按 Tab 键 然后在完成后按 Enter 键 光
  • 如何在 Rust 中将字符串转换为字节向量?

    这可能是有史以来最愚蠢的 Rustlang 问题 但我保证我会尽力在文档或网络上的任何其他地方找到答案 我可以将字符串转换为字节向量 如下所示 let bar bytes some string 不幸的是我不能这样做 let foo som
  • 如何在同一解决方案中运行/调试多个 Web 应用程序项目?

    我有 2 个网络应用程序项目 一个是我的 asp net MVC 应用程序 另一个是与管理相关的功能 即 asp net Web 表单动态数据 我的 MVC 应用程序将是主站点 但我希望 Web 表单在 MVC 站点的 Admin 文件夹下
  • 如何调试 git 别名?

    调试git使用 shell 命令和引用使用别名可能很困难 我怎样才能看到什么git正在为给定的别名执行 In your gitconfig 添加以下内容 debug GIT TRACE 1 git 然后你就可以运行git debug
  • Xamarin.iOS:可执行文件已使用无效权利进行签名

    我最近添加了通知 FCM 到使用以下方法开发的 iOS 应用程序Xamarin iOS 当我尝试在已发布的设备 iPad 和 iPhone 上安装时 安装失败 我发现的所有类似问题都与本机开发有关 我尝试重新生成配置文件 删除并再次添加推送
  • BeautifulSoup find_all() 不返回任何数据

    我对 Python 很陌生 我最近的项目是从博彩网站抓取数据 我想要抓取的是网页上的赔率信息 这是我的代码 from urllib request import urlopen as uReq from bs4 import Beautif
  • 如何以编程方式列出 Rails 中的所有控制器

    我正在尝试构建一个 RESTful 应用程序来实际管理多种可配置对象 因此有大量的 资源 类型 因此有很多控制器 我仍处于 POC 阶段 所以如果我可以在第一个导航页面中显示所有控制器 那就太好了 那么有什么简单的方法 可编程 可以做到这一
  • 如何在 Silverlight 中更改 Textblock 的背景颜色?

    我想要一个黄色背景上有蓝色文本的文本块 我可以使用 前景 属性设置蓝色文本 但 背景 不起作用 我想那太简单了 那么最好的方法是什么 将其包裹在具有背景颜色的矩形或画布中 并且 我们是否应该了解有关 Silverlight 的任何内容 以了
  • 无法使用 ACI 卷。所需的驱动程序是“azure_file”

    尝试使用以下方式在 Azure 中部署此应用程序docker compose version 3 5 x environment default back environment Database settings POSTGRES DB
  • 在javascript中动态更新嵌套对象[重复]

    这个问题在这里已经有答案了 我有一个从 json 解码的对象 var data parentSeries 1 children BusinessRule ChrisTest2 ID ChrisTest2 3 childsub 3 jsonC
  • 如何在 Visual Studio 中将构建配置更改为发布?

    我正在尝试发布一个 Xamarin 项目 我怎样才能将构建配置更改为Release在 Visual Studio 2015 中 Update I have found the solution here it is 根据如何 设置调试和发布
  • 在 Composer 中设置“config.fxp-asset.installer-paths”选项

    当我运行composer update在继续更新之前我收到以下警告 The extra asset installer paths option is deprecated use the config fxp asset installe
  • 设计更好的 API?

    设计 API 时应遵循哪些最佳实践和模式 如何实现隐藏的最佳方式 C Java 设计本质上通用的 API 有哪些参考书 链接可以为初学者提供简洁的示例指导吗 我不确定我对你们所有的个人问题都有一个很好的答案 但我想我对第一个问题确实有一个很
  • isBeingPresented 值不一致

    我以模态方式呈现一个带有 ViewController 的 NavigationController 在 ViewController 中我可以看到self navigationController isBeingPresented是真的
  • Laravel - 将 Guzzle 请求记录到文件

    在开发一个项目时 我发现第三方 API 可以在 Postman 中运行 但不能在 Guzzle Client 中运行 调试 Guzzle 请求可能很困难 那么有没有什么方法可以记录 Guzzle 客户端发出的所有请求 TLDR 有一种简单的
  • Django CSRF 框架无法禁用并且正在破坏我的网站

    django csrf 中间件无法禁用 我已从项目的中间件中将其注释掉 但由于缺少 CSRF 问题 我的登录失败 我在 Django 主干上工作 如果中间件中未启用 CSRF 它如何会导致问题 我必须禁用它 因为我的网站上有很多 POST
  • 如何使用 pandas 获取某种格式的表格并导出为 csv?

    我是 pandas 的新手 我想要一个需要导出 csv 格式的表格 我尝试过的是 o rg o gg a rg a gg 是数组 df1 pd DataFrame RED o rg GREEN o gg df2 pd DataFrame R
  • 根据两列的值删除行

    我有一个巨大的文件 my file txt 大约有 8 000 000 行 如下所示 1 13110 13110 rs540538026 0 NA 1 33177622457982 1 13116 13116 rs62635286 0 NA
  • 在基本控制器中重写 ASP.NET MVC 中的 OnAuthorization

    在我的 ASP NET MVC 应用程序中 我试图确定用户是否有权访问特定控制器 该控制器受授权数据注释的限制 如下所示 Authorize Roles user 我正在尝试覆盖 OnAuthorization 以检查 如果请求已通过身份验
  • 在 C# 中异步加载图像

    我正在开发一个 C WPF 应用程序 它加载大量图像并将其显示为缩略图 我想以多线程的方式来做 因此我尝试实现一个BackgroundWorker BackgroundWorker的DoWork 的代码 string files e Arg