我有一个用C#WPF编写的应用程序,它具有树/文件夹结构,该结构显示包含许多项目的ObservableCollection。
有一个过滤器功能,用户可以在其中输入值,搜索将自动执行并在主UI上实时更新。类似于您在Google的搜索引擎上搜索内容时,会弹出一个“自动提示”框,该框会在您每次输入新字符或单词时更新。
在某些情况下,如果集合中有许多数据集(超过100,000个项目),并且一旦我开始对我输入的值进行后退(例如从将abcd输入到文本框中后,再从abc改为后退从ab开始),我的应用程序的主UI冻结,程序完全崩溃。我想创建一个单独的线程来执行此操作(将方法转换为异步并按以下方式使用await Task.Run()是最简单的解决方案,但Visual Studio告诉我,主UI线程之外的线程无法进行更改在Google进行快速搜索之后,似乎实际上不建议这样做,所以我想知道是否还有其他方法可以解决此问题?
答案 0 :(得分:-1)
在单独的线程上进行搜索,然后重新输入UI线程以将结果放入集合中。
答案 1 :(得分:-2)
如错误所述,您不能从UI线程外部修改ObservableCollection
。
幸运的是,有Dispatcher
允许您将上下文切换到另一个线程并随意运行,就像这样:
Application.Dispatcher.Invoke( () => myCollection.Add(myObj) )
哪个将从主/ UI线程同步运行。要异步执行某项操作,请使用BeginInvoke()
而不是Invoke()