c# - 可以在主 UI 线程之外的线程上更改 ObservableCollection 吗?
问题描述
我有一个用 C# WPF 编写的应用程序,它有一个树/文件夹结构,它显示一个包含许多项目的 ObservableCollection。
有一个过滤器功能,用户可以输入值,搜索将自动执行并在主 UI 上实时更新。类似于如果您在 Google 的搜索引擎上搜索某些内容,并且每次输入新字符或单词时都会弹出一个自动建议框,该框会更新。
有一种情况,如果集合有许多数据集(超过 100,000 个项目),并且一旦我开始退格我输入的值(例如,从将 abcd 输入到文本框后到 abc 到 ab 从退格)主 UI我的应用程序冻结并且完全使程序崩溃。我想创建一个单独的线程来执行此操作(将方法转换为异步并使用 await Task.Run() 如下将是最简单的解决方案,但 Visual Studio 告诉我主 UI 线程之外的线程无法进行更改到可观察的集合。在快速谷歌搜索之后,似乎实际上不建议这样做,所以我想知道是否有其他方法可以解决这个问题?
解决方案
在单独的线程上进行搜索,然后重新进入 UI 线程以将结果放入集合中。
推荐阅读
- postgresql - 在 PostgreSQL 11.0 的表中创建外键时出错
- racket - 球拍标量向量乘法
- php - php基于时间的背景
- batch-file - 批处理文件以将文件复制到具有日期名称的新创建的文件夹
- sql - 在 Sybase 中有效处理通配符
- azure-pipelines - 如何使用映射数据流在 azure 数据工厂中显示 2020 年 11 月 13 日等日期?
- azure - 使用 ClientID 访问 Blob 存储仅在具有 azure 访问权限的 Windows 帐户上运行时有效
- qt - 如何在可重用的 QML 组件中保留绑定?
- reactjs - 如何解构这个对象?
- python - 启用急切执行时不支持 tf.gradients。改用 tf.GradientTape