C# ConcurrentDictionary扩展方法导致线程不安全
调用 ConcurrentDictionary 本身的方法和属性可以保证都是线程安全的。但是由于 ConcurrentDictionary 实现了一些接口(例如 ICollection、IEnumerable 和 IDictionary 等),使用这些接口的成员(或者这些接口的扩展方法)不能保证其线程安全性
调用扩展方法导致线程不安全实例代码:
public void Run() { var cd = new ConcurrentDictionary<int, int>(); Task.Run(() => { var random = new Random(); while (true) { var value = random.Next(10000); cd.AddOrUpdate(value, value, (key, oldValue) => value); } }); while (true) { //cd.ToArray(); cd.ToList(); //调用 System.Linq.Enumerable.ToList,抛出 System.ArgumentException 异常 } }
当运行几秒后后报错:
原因:
因为ToList方法是扩展方法,线程不安全导致越界访问
解决方法:
使用自带的ToArray方法
参考连接:
https://my.oschina.net/u/135083/blog/4819150