我一次又一次发现自己必须编写 BindingList 和 ObservableCollection 的线程安全版本,因为当绑定到 UI 时,这些控件无法从多个线程更改。我想理解的是why情况就是这样——这是设计错误还是故意的?
问题是设计一个线程安全集合并不简单。当然,设计一个可以从多个线程修改/读取而不破坏状态的集合是足够简单的。但设计一个可用的集合要困难得多,因为它是从多个线程更新的。以下面的代码为例。
if ( myCollection.Count > 0 ) {
var x = myCollection[0];
}
假设 myCollection 是一个线程安全集合,其中保证添加和更新不会破坏状态。此代码不是线程安全的并且是竞争条件。
为什么?即使 myCollection 是安全的,也不能保证对 myCollection 的两个方法调用之间不会发生更改:即 Count 和索引器。另一个线程可以介入并删除这些调用之间的所有元素。
坦率地说,此类问题使得使用此类集合成为一场噩梦。您永远不能让一个调用的返回值影响对集合的后续调用。
EDIT
我在最近的一篇博客文章中扩展了这个讨论:http://blogs.msdn.com/jaredpar/archive/2009/02/11/why-are-thread-safe-collections-so-hard.aspx http://blogs.msdn.com/jaredpar/archive/2009/02/11/why-are-thread-safe-collections-so-hard.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)