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

posted @ 2021-03-06 16:15  温故纳新  阅读(335)  评论(0编辑  收藏  举报