关于 ConcurrentDictionary 遍历问题

2020-06-15 13:53发布

问题:

昨天我发现ConcurrentDictionary.ToArray()方法很好用,今天我就发现在遍历的时候出了问题,淦!

        public static Track GetTrack(string callSign)
        {
            if (ADS_B.Tracks.GlobalInstance.TrackList.Count !=0)
            {
                foreach (var pair in ADS_B.Tracks.GlobalInstance.TrackList.ToArray())
                {
                    if (pair.Value.Identification.Equals(callSign) || pair.Value.Identification == callSign)
                    {
                        return pair.Value;
                    }
                }
            }
                return null;
        }

错误:

引发的异常:“System.NullReferenceException”(位于 ....)
未将对象引用设置到对象的实例。

回答1:

ConcurrentDictionary 线程安全 不代表它存储的对象也是线程安全的。



回答2:

线程安全的资源变成了非线程安全的资源,多线程操作非线程安全的资源自然就会出现空引用的情况,对象X在A线程中已经disposed掉了,B线程不知道情况下继续操作对象X



回答3:

这种操作慎用,严重降低ConcurrentDictionary的性能。