private Hashtable myDataList = new Hashtable();
:
lock (myDataList.SyncRoot)
{
if (myDataList.Count <= 0) return;
Hashtable updates = new Hashtable();
//try
//{
foreach (string dataId in myDataList.Keys)
{
MyData dInfo = (MyData)myDataList[dataId];
dInfo.data1 = "hello gunman";
updates.Add(dataId, dInfo);
}
foreach (DictionaryEntry upd in updates)
{
myDataList[upd.Key] = upd.Value;
}
//}
//catch
//{
//}
}
}Hashtable 값을 Iteration 하는 코드를 상기와 같이 사용하는데 아래와 같은 오류를 만났습니다.
System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
분명히 iteration 전에 lock을 걸어 주고 있음에도 말입니다.
결국은 Hashtable 의 값을 추가/변경하는 측에도 아래와 같이 lock을 걸어야 하더군요.
lock (myDataList.SyncRoot)
{
for (var i = 0; i < 100; i++)
{
string uniqId = count++ + "";
MyData data = new MyData("hi gunman");
myDataList.Add(uniqId, data);
}
}어느 한쪽만 사용해서는 lock의 효과를 볼 수 없었습니다 >.<