最近我在使用通用字典时遇到了以下异常
发生了 InvalidOperationException。集合已修改
我意识到这个错误主要是因为我使用的静态字典的线程安全问题。
一点背景:我目前有一个应用程序,它有 3 种与此问题相关的不同方法。
foreach
方法 A 使用并返回一个值遍历字典。- 方法 B 将数据添加到字典中。
- 方法 C 更改字典中键的值。
有时在遍历字典时,还会添加数据,这就是导致此问题的原因。foreach
我在迭代字典内容的代码部分中不断收到此异常。为了解决这个问题,我用 替换了通用字典,ConcurrentDictionary
这里是我所做的详细信息。
目标:我的主要目标是完全消除异常
对于方法 B(向字典添加新键),我替换.Add
为TryAdd
对于方法 C(更新字典的值),我没有做任何更改。代码的粗略草图如下:
static public int ChangeContent(int para)
{
foreach (KeyValuePair<string, CustObject> pair in static_container)
{
if (pair.Value.propA != para ) //Pending cancel
{
pair.Value.data_id = prim_id; //I am updating the content
return 0;
}
}
return -2;
}
对于方法 A - 我只是在字典上进行迭代,这是运行代码停止的地方(在调试模式下),Visual Studio 告诉我这是发生错误的地方。我使用的代码类似于以下
static public CustObject RetrieveOrderDetails(int para)
{
foreach (KeyValuePair<string, CustObject> pair in static_container)
{
if (pair.Value.cust_id.Equals(symbol))
{
if (pair.Value.OrderStatus != para)
{
return pair.Value; //Found
}
}
}
return null; //Not found
}
这些更改是否会解决我遇到的异常。
编辑:
它在此页面上声明该方法GetEnumerator
允许您在写入的同时遍历元素(尽管它可能已过时)。这和使用 foreach 不一样吗?