gpt4 book ai didi

c# - .NET 4.0 System.Collections.Concurrent 集合在 .NET 3.0 SynchronizedCollection 的功能中添加了什么?

转载 作者:可可西里 更新时间:2023-11-01 09:04:22 30 4
gpt4 key购买 nike

.NET 4.0 引入了 System.Collections.Concurrent命名空间:

"The System.Collections.Concurrent namespace provides several thread-safe collection classes that should be used in place of the corresponding types in the System.Collections and System.Collections.Generic namespaces whenever multiple threads are accessing the collection concurrently"

SynchronizedCollection<T> 类(自 .NET 3.0 起可用):

"Provides a thread-safe collection that contains objects of a type specified by the generic parameter as elements"

...在 System.Collections.Generic 中命名空间。

那么,为什么 SynchronizedCollection<T> 类线程安全但不是并发?

具体是什么造就了 SynchronizedCollection<T> generic class System.Collections.Concurrent 中的集合不同且不兼容?

更新:让我改一下问题:属于 System.Collections.Concurrent 的所有通用集合的共同点和区别新特征是什么?命名空间,在 SynchronizedCollection<T> generic class 中不存在(并且在使用时不可能) ?

我将标题更改为“什么 .NET 4.0 System.Collections.Concurrent 集合功能添加到 .NET 3.0 SynchronizedCollection?”。但我最感兴趣的是,是什么导致无法在 .NET 3.0 的基础上完成

更新 2:关于注释:

"This question may already have an answer here:

What is the difference between SynchronizedCollection and the other concurrent collections?"

答案is confusing in context of my question - 新功能是进化的(使用 .NET 4.0 之前的功能)还是革命性的(在 .NET 4.0 之前的功能中不可用)?

最佳答案

以前的线程安全的集合类有一个比较大的缺陷,就是不能线程安全的迭代。迭代通常很难实现线程安全,没有干净的方法可以让使用迭代器的代码知道添加到集合或从集合中删除的项目代码正在迭代集合.唯一真正安全的方法是在迭代发生时锁定对集合的访问。这是非常不可取的,这样的锁通常会持有很长时间。下一个最好的方法是制作一个集合的副本,一个不会被修改的副本,因此总是可以安全地迭代。没有人喜欢该解决方案的 O(n) 存储要求。

.NET 1.0 集合类中的 Synchronized() 方法特别麻烦。微软并没有将迭代不是线程安全的作为 secret 。他们甚至添加了代码来检测事故,当线程修改集合时它会抛出异常。然而,这种异常并没有经常发生,并且困惑的 .NET 程序员未能阅读警告标签,只是断然假设线程安全集合肯定是安全的,无论您做什么。嗯,事实并非如此,当集合上的最基本操作不是线程安全的时,将集合称为“线程安全”当然是一个问题。 Microsoft 的意思是“它是线程安全的,因为使用线程不会破坏集合”。程序员阅读 的是“它是线程安全的”。 Microsoft 没有在 .NET 2.0 泛型集合类中重蹈覆辙。

这在 .NET 4 中得到解决,迭代新集合不会引发异常。他们不会以其他方式采取任何措施来防止您的代码因为读取陈旧数据而出现异常行为。这是您必须自己解决的无法解决的问题。

关于c# - .NET 4.0 System.Collections.Concurrent 集合在 .NET 3.0 SynchronizedCollection 的功能中添加了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15106938/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com