关于 ConcurrentDictionary 遍历问题

2020-06-15 14:01发布

昨天我发现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”(位于 ....)
未将对象引用设置到对象的实例。

3条回答
三岁会撩人
2楼-- · 2020-06-15 14:08

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

查看更多
ゆ 、 Hurt°
3楼-- · 2020-06-15 14:27

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

查看更多
淡お忘
4楼-- · 2020-06-15 14:28

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

查看更多
登录 后发表回答