首页 > 解决方案 > 可以在主 UI 线程之外的线程上更改 ObservableCollection 吗?

问题描述

我有一个用 C# WPF 编写的应用程序,它有一个树/文件夹结构,它显示一个包含许多项目的 ObservableCollection。

有一个过滤器功能,用户可以输入值,搜索将自动执行并在主 UI 上实时更新。类似于如果您在 Google 的搜索引擎上搜索某些内容,并且每次输入新字符或单词时都会弹出一个自动建议框,该框会更新。

有一种情况,如果集合有许多数据集(超过 100,000 个项目),并且一旦我开始退格我输入的值(例如,从将 abcd 输入到文本框后到 abc 到 ab 从退格)主 UI我的应用程序冻结并且完全使程序崩溃。我想创建一个单独的线程来执行此操作(将方法转换为异步并使用 await Task.Run() 如下将是最简单的解决方案,但 Visual Studio 告诉我主 UI 线程之外的线程无法进行更改到可观察的集合。在快速谷歌搜索之后,似乎实际上不建议这样做,所以我想知道是否有其他方法可以解决这个问题?

标签: c#wpfmultithreadingasynchronousobservablecollection

解决方案


在单独的线程上进行搜索,然后重新进入 UI 线程以将结果放入集合中。


推荐阅读