集合已修改;可能無法執行枚舉操作。

問題描述:在用foreach遍歷hashtable的時候,彈出“集合已修改;可能無法執行枚舉操作。”

問題代碼:       

 private void Check(int TimeOut)        //這是一個存活檢查線程,爲了把連接失效的主機剔除
        {
            DateTime t = DateTime.Now;//取出當前的時間
           //Hashtable
            foreach (DictionaryEntry item in _transmit_tb)//彈出“集合已修改;可能無法執行枚舉操作。”
            {
                
                if ((t - (DateTime)Time[item.Key]).Seconds > TimeOut)
                {
                    LogOut(item.Key);                                      //此函數的作用是剔除失效的主機


                }
            }
        }



解決方法:利用for進行遍歷。

ArrayList   akeys=new   ArrayList(_transmit_tb.Keys);   
for(int   p=akeys.Count-1;p> -1;p--) 

_transmit_tb.Remove(akeys[p]); 
}


原因:

1、hashtable存放你放入的值的時候   不是按照你存放順序放的 
所以當你用foreach遍歷的時候   就不能保證遍歷出來的順序和你原來存放進去的順序是一致的

2、msdn的解釋:foreach 語句是對枚舉數的包裝,它只允許從集合中讀取,不允許寫入集合。

也就是,不能在foreach裏遍歷的時侯把它的元素進行刪除或增加的操作的


部分內容參考:http://topic.csdn.net/t/20050412/21/3931090.html

另外附上一篇:集合遍歷時刪除和增加元素

http://blog.csdn.net/educast/article/details/5875955

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章