随笔 - 86  文章 - 0  评论 - 737  阅读 - 18万

『卧槽』意外发现了 Hashtable 的 foreach 用法 BUG

这段时间,公司项目中 遇到一个问题,最后查出: 是 Hashtable 的用法导致的。

 

复制代码
 1         private static void AutoCleanCache()
 2         {
 3             try
 4             {
 5                 lock (m_HashCache.SyncRoot)
 6                 {
 7                     List<object> listKey = new List<object>();
 8                     List<Tuple<string, DateTime, byte[]>> list = new List<Tuple<string, DateTime, byte[]>>();
 9                     if (m_HashCache.Count >= MAXCACHE)
10                     {
11                         //foreach (KeyValuePair<object, object> pair in m_HashCache)  //不能这样使用 Hashtable —— 可能会导致: 指定的转换无效 的异常
12                         foreach (object key in m_HashCache.Keys)
13                         {
14                             object value = m_HashCache[key];
15                             var svg = key as string;
16                             var bytes = value as Tuple<DateTime, byte[]>;
17                             if (string.IsNullOrWhiteSpace(svg) || (bytes == null || bytes.Item2 == null || bytes.Item2.Length <= 0)) listKey.Add(key);
18 
19                             list.Add(new Tuple<string, DateTime, byte[]>(svg, (bytes == null ? DateTime.MinValue : bytes.Item1), (bytes == null ? null : bytes.Item2)));
20                         }
21                     }
22 
23                     List<Tuple<string, DateTime, byte[]>> list2 = Enumerable.ToList(list.OrderBy(x => x.Item2).Take(list.Count / 2));
24                     foreach (var item in list2) listKey.Add(item.Item1);
25                     foreach (var key in listKey) m_HashCache.Remove(key);
26 
27                     listKey.Clear();
28                     list.Clear();
29                     list2.Clear();
30                 }
31             }
32             catch (Exception ex)
33             {
34                 logger.Warn(ex);
35             }
36         }
复制代码

 

代码很丑 —— 各位不要介意。

我们只看重点代码:

1 //foreach (KeyValuePair<object, object> pair in m_HashCache) //不能这样使用 Hashtable —— 可能会导致: 指定的转换无效 的异常
2 foreach (object key in m_HashCache.Keys)

 

结论:

Hashtable 不要  foreach  KeyValuePair<object, object>

 

 

这下好了, 我这边 一堆底层代码 都遭殃了 ~ 

 

posted on   InkFx  阅读(376)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 单线程的Redis速度为什么快?
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示