【发布时间】:2025-11-30 21:40:01
【问题描述】:
我正在使用 WPF CollectionView 并在后台线程中设置过滤器,因为应用此过滤器需要很长时间。
设置此过滤器会触发 CollectionView 的方法ScheduleMapCleanup()(所以我无法更改 WPF 框架代码)。在这个方法中,使用了 Dispatcher.CurrentDispatcher.BeginInvoke。
但是,因为这是在后台线程中执行的,所以这个Action永远不会执行(这个线程的Dispatcher永远不会启动),导致内存泄漏:Dispatcher保持对CollectionView的引用。
我该如何解决这个问题?在 UI 线程中设置过滤器不是一种选择。
我可以自己启动 Dispatcher 吗?如果是这样,我该怎么做(Dispatcher.Run 停止一切)?
【问题讨论】:
-
你能添加一些你的代码吗?你是怎么做到的?
-
没有太多代码可以展示。我只是在做 collectionView.Filter = new Predicate
-
尽管您的“在 UI 线程中设置过滤器不是一个选项。”,您尝试过吗?发生了什么?应用过滤器不应真正阻塞 UI。
-
"在 UI 线程中设置过滤器不是一个选项。"为什么?
CollectionViewSource被明确记录为不是线程安全的。 -
@Mitch:设置过滤器属性可能需要几分钟(取决于列表中的项目数和过滤器的复杂性)。因此,在此期间冻结 UI 并不是一个真正的选择。通过将它设置在后台线程中,UI 保持可用,并且我可以向用户显示一个很好的加载指示。
标签: c# wpf multithreading dispatcher