可以在主UI线程之外的线程上更改ObservableCollection吗?

时间:2018-08-17 17:58:30

标签: c# wpf multithreading asynchronous observablecollection

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

有一个过滤器功能,用户可以在其中输入值,搜索将自动执行并在主UI上实时更新。类似于您在Google的搜索引擎上搜索内容时,会弹出一个“自动提示”框,该框会在您每次输入新字符或单词时更新。

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

2 个答案:

答案 0 :(得分:-1)

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

答案 1 :(得分:-2)

如错误所述,您不能从UI线程外部修改ObservableCollection

幸运的是,有Dispatcher允许您将上下文切换到另一个线程并随意运行,就像这样:

Application.Dispatcher.Invoke( () => myCollection.Add(myObj) )

哪个将从主/ UI线程同步运行。要异步执行某项操作,请使用BeginInvoke()而不是Invoke()