背景
ObservableCollection 我们之前介绍过他和List的区别。ObservableCollection 的好处在于,当集合发生变化时,能发送通知通知界面发生相应的更改。但是ObservableCollection 有个弊端。无法在非UI线程中访问。
要么就是通知失效了,要么就是直接报错了。
解决方法1
既然只能时UI线程访问,那就交给UI线程访问就好了:
Application.Current.Dispatcher.Invoke(() =>
{ImageFiles.Add(pictruePath);
});
通过添加Dispatcher这种方式,让其调用转交给UI线程。
但是这样写,我觉得太蛮烦了,而且很多地方加上这样一句不是很美观。
解决方案2
使用,ObservableConcurrentQueue 替换 ObservableCollection 。
他是一个第三方的包,他是线程安全的,基于经典并发队列 (System.Collections.Concurrent.ConcurrentQueue) 的 Observable 并发队列 允许在队列内容更改时引发事件,其事件与 ObservableCollection 相同。
有了他之后,就不需要Dispatcher这段代码了。
不过ObservableConcurrentQueue 并没有Add
方法,取而代之的是Enqueue
(入列)这个方法!