博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在Dictionary使用foreach的注意
阅读量:5102 次
发布时间:2019-06-13

本文共 1447 字,大约阅读时间需要 4 分钟。

最近在对博客园的程序进行性能优化,在优化过程中用到了Dictionary<tkey, tvalue="">,在通过foreach将Dictionary<tkey, tvalue="">中的数据写入数据库时,遇到了这样的错误:

     Collection was modified; enumeration operation may not execute.
     
     代码类似这样的:     

Dictionary<int, int> _dictionary = new Dictionary<int, in>();
//添加数据操作省略
foreach(KeyValuePair<int, int> item in _dictionary)
 {
 }

     在执行foreach时,其他线程对_dictionary进行了Add操作,改变了_dictionary中的数据,从而产生了上述的异常信息。

     那什么会产生这样的异常信息呢?

     foreach实际上执行的代码是:    

Dictionary<int, int>.Enumerator enumerator = _dictionary.GetEnumerator(); 
try  
   while (enumerator.MoveNext())  
   { 
     
    } 
finally  
   IDisposable d = enumerator as IDisposable; 
   if (d != null) d.Dispose(); 
}

     通过Reflector查看Dictionary<TKey, TValue>.Enumerator.MoveNext()源代码,我们会发现开始处有这样的代码:

if (this.version != this.dictionary.version)
      {
            ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);
      }

     而异常就是在这里发生的,因为Add操作时改变了Dictionary的version,通过查看Insert(TKey key, TValue value, bool add)的源代码会看出。

     我觉得Dictionary<TKey, TValue>应该提供一个方法,可以设置在MoveNext时是否进行版本检查,因为有时在foreach操作时,可能并不关心Dictionary中的数据是否被修改,我遇到的就是这样的情况,现在由于这个问题而不能使用foreach,而只能采取其他方法遍历Dictionary<TKey, TValue>中的数据。
     我采用的方法是:

Dictionary<int, int> _dictionary = new Dictionary<int, in>();
//添加数据操作省略
int[] dataArray = new int[_dictionary.Values.Count];
_ dictionary.Values.CopyTo(evcArray, 0)
for (int i = 0; i < dataArray.Length; i++)
  {
   }
posted on
2012-07-30 15:16 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/jljxxf/archive/2012/07/30/2615315.html

你可能感兴趣的文章
Android打包key密码丢失找回
查看>>
03 jQuery动画
查看>>
医药箱APP静态小项目
查看>>
安装使用eclipse
查看>>
VC6.0调试技巧(一)(转)
查看>>
linux命令
查看>>
类库与框架,强类型与弱类型的闲聊
查看>>
webView添加头视图
查看>>
php match_model的简单使用
查看>>
在NT中直接访问物理内存
查看>>
Intel HEX 文件格式
查看>>
SIP服务器性能测试工具SIPp使用指导(转)
查看>>
php_扑克类
查看>>
回调没用,加上iframe提交表单
查看>>
(安卓)一般安卓开始界面 Loding 跳转 实例 ---亲测!
查看>>
Mysql 索引优化 - 1
查看>>
LeetCode(3) || Median of Two Sorted Arrays
查看>>
大话文本检测经典模型:EAST
查看>>
文本主题模型之LDA(一) LDA基础
查看>>
linux基础命令-chgrp/chown/chomd
查看>>