Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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 4+;收藏?_C#_.net_Multithreading - Fatal编程技术网

C# 使用线程安全的.NET 4+;收藏?

C# 使用线程安全的.NET 4+;收藏?,c#,.net,multithreading,C#,.net,Multithreading,System.collections.Concurrent中的集合在所有情况下都是完全线程安全的吗?或者,在使用来自多个线程的多个并发集合时,理论上是否可能导致死锁 谢谢。这些类(大部分)是线程安全的,如MSDN上所述。例如,报告明确指出: ConcurrentQueue的所有公共和受保护成员都是线程安全的,可以从多个线程并发使用 所有需要的同步都在内部处理 还请注意,某些类型存在一些次要的线程安全问题,例如BlockingCollection.Dispose(),它不是线程安全的,但是: Di

System.collections.Concurrent中的集合在所有情况下都是完全线程安全的吗?或者,在使用来自多个线程的多个并发集合时,理论上是否可能导致死锁

谢谢。

这些类(大部分)是线程安全的,如MSDN上所述。例如,报告明确指出:

ConcurrentQueue的所有公共和受保护成员都是线程安全的,可以从多个线程并发使用

所有需要的同步都在内部处理

还请注意,某些类型存在一些次要的线程安全问题,例如
BlockingCollection.Dispose()
,它不是线程安全的,但是:

Dispose方法不是线程安全的。BlockingCollection的所有其他公共和受保护成员都是线程安全的,可以从多个线程同时使用


也就是说,如果您自己进行同步,可能会导致与这些类型的使用无关的死锁。如果您遇到死锁,很可能是由于您的代码或正在使用的库中的其他同步造成的。

当然,某些类型的使用方式肯定会导致死锁。例如,阻塞直到元素可用,因此如果您在UI线程上调用此函数,而生成Take项的某个后台线程最终不得不通过UI线程同步某些内容(例如,有一个COM依赖项在后台静默封送),您可能会死锁。与往常一样,在处理线程时,即使在使用“线程安全”类时,也建议一定程度的偏执。

线程安全是这个名称空间的全部要点…@ken2k是的,但仅仅在这个名称空间中并不能保证所有的线程安全……你需要定义你所说的线程安全。塞维,这本书读得很好。谢谢