Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.NET 3.0 SynchronizedCollection的功能中添加了哪些.NET 4.0 System.Collections.Concurrent collection?_C#_Multithreading_Collections_Concurrency_Thread Safety - Fatal编程技术网

C# 在.NET 3.0 SynchronizedCollection的功能中添加了哪些.NET 4.0 System.Collections.Concurrent collection?

C# 在.NET 3.0 SynchronizedCollection的功能中添加了哪些.NET 4.0 System.Collections.Concurrent collection?,c#,multithreading,collections,concurrency,thread-safety,C#,Multithreading,Collections,Concurrency,Thread Safety,.NET 4.0引入了名称空间: “名称空间提供了几个 线程安全的集合类,应该用来代替 和中的相应类型 多线程时的名称空间 正在同时访问集合“ 阶级 阶级 阶级 阶级 阶级 阶级 接口 该类(从.NET 3.0开始提供): “提供包含类型为的对象的线程安全集合 由泛型参数指定为“元素” …位于System.Collections.Generic命名空间中 那么,为什么类是线程安全的,而不是并发的呢 是什么具体地使这些产品与中的产品有所不同,并且与中的产品不兼容 更新: 让我重新表述一下问题:

.NET 4.0引入了名称空间:

“名称空间提供了几个 线程安全的集合类,应该用来代替 和中的相应类型 多线程时的名称空间 正在同时访问集合“

  • 阶级
  • 阶级
  • 阶级
  • 阶级
  • 阶级
  • 阶级
  • 接口
该类(从.NET 3.0开始提供):

“提供包含类型为的对象的线程安全集合 由泛型参数指定为“元素”

…位于
System.Collections.Generic
命名空间中

那么,为什么类是线程安全的,而不是并发的呢

是什么具体地使这些产品与中的产品有所不同,并且与中的产品不兼容

更新: 让我重新表述一下问题: 属于名称空间的所有泛型集合中的共同点和区别新特性是什么,在名称空间中不存在(并且在使用时不可能存在)

我将标题更改为“什么.NET 4.0
System.Collections.Concurrent
collection在.NET 3.0
SynchronizedCollection
?”中添加了功能”。 但我最感兴趣的是,是什么原因使得在.NET 3.0的基础上做不到这一点

更新2: 关于说明:

“这个问题可能已经有了答案:

"


答案-新功能是进化的(使用.NET 4.0之前的功能)还是革命性的(在.NET 4.0之前的版本中不可用)?

链接的副本回答了您问题中的“新功能”部分。我将在这里就这个问题发言:

是什么使它无法在.NET3.0的基础上运行

我的猜测是,没有什么能让这件事变得不可能。我怀疑,如果您在.NET4.0中得到新类的反编译,并且(根据需要进行语法更改)自己在.NET3.5中创建这样的类,那么它们将工作得非常好

这与如果.NET4.0不可用时的情况相同。事实上,我记得在某处看到了针对.NET2.0的类似LINQ的库的实现(当然没有C语言特性!)

在.NET中,除非库依赖于新的CLR功能,否则没有任何东西可以阻止对早期版本重新实现库。这种情况的一个显著例子是泛型:在.NET2.0之前,如果不手动启动每个不同的类,可能使用codegen工具(例如)就无法获得类型安全集合支持


因此,如果没有任何东西阻止.NET3.5中并发类的存在,为什么微软当时不创建它们呢?简单地说,时间和预算-发货是一项功能,有些功能没有那么重要,因此它们必须等到更高版本。

NET 4.0的主要重点是并发性。Microsoft在.NET 4.0中引入了名称空间,因此添加System.Collections.Concurrent名称空间也很有意义。如前所述,System.collections.Concurrent中的集合是高性能的,因为它们是以无锁方式实现的。这不是一项容易的任务,我想这就是为什么微软觉得它应该出现在一个新的主要的.NET版本中,而不是更新.NET3.x。AFAIK的无锁行为是使用.NET4.0的通用版本实现的


如果您对如何实现System.Collections.Concurrent类感兴趣,我建议您阅读Joe Duffy在.NET 4.0发布之前撰写的书。这本书展示了一些并发集合是如何实现的。

以前的线程安全集合类有一个相当大的缺陷,它们不能以线程安全的方式进行迭代。迭代通常很难使线程安全,没有干净的方法可以让使用迭代器的代码在迭代集合时知道向集合中添加或从集合中删除的项。唯一真正安全的方法是在迭代进行时锁定对集合的访问。这是非常不可取的,这样的锁通常会保持很长时间。下一个最好的方法是创建集合的副本,该副本不会被修改,因此始终可以安全地进行迭代。没有人喜欢该解决方案的O(n)存储需求

.NET 1.0集合类中的Synchronized()方法特别麻烦。微软并没有把迭代不是线程安全的作为秘密。他们甚至添加了代码来检测这个问题,当一个线程修改了集合时,它会抛出一个异常。然而,这种异常并不是经常发生的,并且使.NET程序员感到困惑,他们没有阅读警告标签,只是想当然地认为无论您做什么,线程安全的集合都是安全的。事实并非如此,当集合上的最基本操作不是线程安全时,调用集合“线程安全”当然是个问题。微软的意思是“它是线程安全的,因为使用线程不会损坏集合”。程序员读到的是“它是线程安全的”。微软在.NET2.0通用集合类中没有重复同样的错误


这是在.NET4中解决的,迭代新集合不会引发异常。否则,他们不会做任何事情来防止您的代码出现错误,因为它正在读取过时的数据。这是一个无法解决的问题,你必须自己解决。

你说的“线程安全但不并发”是什么意思?不是我。MSDN告诉我们所有的集合都是线程安全的,但不在其中,也许这只是命名法。如果我没记错的话,Systems.Collections.Concurrent在.NET3.0中并不常见。为了不破坏任何现有的代码