1、接收线程将接收数据写到字典A中。 字典A的数据是实时更新的。
2、在定时器定时函数里面,创建B字典,并把A字典(jsnParser.dicRunData)拷贝到B字典( dicRunData)。
1)在把A拷贝到B的过程中有上锁。
mutexDevData.mutex.WaitOne();
dicRunData = new Dictionary<string, dsRunData>(jsnParser.dicRunData);
mutexDevData.mutex.ReleaseMutex();
2)在更新A的时候也有上锁:
mutexDevData.mutex.WaitOne();
dicRunData[sn] = runData;
mutexDevData.mutex.ReleaseMutex();
runData是一个数据对象,即字典的_值_,sn是字典的_健_
3、同时在定时器函数里面,遍历B字典每个元素,更新界面。定时器周期0.5s。
运行报错:
“System.InvalidOperationException”类型的第一次机会异常在 mscorlib.dll 中发生
System.InvalidOperationException: 集合已修改;可能无法执行枚举操作。
在 System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
在 System.Collections.Generic.Dictionary`2.Enumerator.MoveNext()
在 mqtt.Frm_DataView.updateDgv() 位置 e:\vs_test\mqttHelperV2\mqtt\Frm_DataView.cs:行号 478
问题:
怎样避免上面错误发生