迭代器是.NET编程模型的核心。只有很少的开发人员以索引数据的方式工作,很多人都喜欢使用for-each循环来完成大部分任务。但是这种固有地顺序访问方式,在我们大量开发多线程应用程序的时候还适合吗?
Bill McCarthy写到:
如果你考虑一下迭代器获取下一个元素的这一主要任务,然后研究一下它是如何工作,你就应该明白它的重要设计缺陷……这个操作不是原子性的。迭代器是IEnumerator或IEnumerator(Of T)的实现,IEnumerator要求你首先调用MoveNext方法然后读取Current属性。如果你允许多线程使用同样的IEnumerator,那么你将得到这样一个调用序列:MoveNext、MoveNext、Current、Current,这样将跳过一个条目而重复下一个条目。所以IEnumerator并没有很好地考虑多线程的情况。这是一个已知的设计限制,但是不仅如此,像C#这样实现自己迭代器的语言还为每个线程生成了不同的迭代器。那就是说,C#不仅认可了这种限制,还加强了它。
Bill继续提到,一种新IEnumerator要如何工作才能正确地支持多线程。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14420698/viewspace-426861/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/14420698/viewspace-426861/