Dictionary<int, TS_EIT> Whole_EITOtherSchedule_dic = new Dictionary<int, TS_EIT>();
Dictionary<int, List<int>> Whole_EITOtherSchedule_ServiceIDtoEventIDs_dic = new Dictionary<int, List<int>>();
object EIT_Locker = new object(); private void TS_Analyze(FileStream fs, int Packetsize)
{
for (int i = 0; i < fs.Length / Packetsize; i++)
{
//**********
if (EIT.table_id >= 0x60 && EIT.table_id <= 0x6F)
{
lock (EIT_Locker)
{
if (!Whole_EITOtherSchedule_dic.ContainsKey(EIT.service_id))
{
Whole_EITOtherSchedule_dic.Add(EIT.service_id, EIT);
Whole_EITOtherSchedule_ServiceIDtoEventIDs_dic.Add(EIT.service_id, new List<int>());
foreach (TS_EIT_Events EIT_Event in EIT.List_EIT_Events)
{
Whole_EITOtherSchedule_ServiceIDtoEventIDs_dic[EIT.service_id].Add(EIT_Event.event_id);
}
}
else
{
foreach (TS_EIT_Events EIT_Event in EIT.List_EIT_Events)
{
if (Whole_EITOtherSchedule_ServiceIDtoEventIDs_dic[EIT.service_id].IndexOf(EIT_Event.event_id) < 0)
{
Whole_EITOtherSchedule_ServiceIDtoEventIDs_dic[EIT.service_id].Add(EIT_Event.event_id);
Whole_EITOtherSchedule_dic[EIT.service_id].List_EIT_Events.Add(EIT_Event);
}
}
}
}
}
}
private void Tree_TS_Right_AfterExpand(object sender, DevComponents.AdvTree.AdvTreeNodeEventArgs e)
{
string s = e.Node.TagString;
if (e.Node.TagString == "EIT Other Schedule")
{
new System.Threading.Thread(
delegate()
{
lock (EIT_Locker)
{
foreach (TS_EIT EIT in Whole_EITOtherSchedule_dic.Values)
{
TSCommon.ComposeEIT(EIT, e.Node);//用信息组合树节点
}
}
}
).Start();
}
}如上代码(没有贴出全部内容),为什么在事件里执行组合节点的方法还是提示集合已修改,我已经使用lock了,是用的不对吗?请大虾指教
换成tostring之后,试了下展开事件点击的慢的话没事,快的话还是会报错
2、及时采取1中的方法,对集合类型的枚举操作是无法锁定的。
你说的是不是SyncRoot属性这是非泛型集合的属性,用来锁定用,泛型集合类似于我那么锁定应该是没问题的
很可能你在某处对某一个TS_EIT中某一属性进行了修改,比如调用了一个方法进行计数之类的。不行你就复制吧后再使用吧。Dictionary<int, TS_EIT> aaa = new Dictionary<int, TS_EIT>(Whole_EITOtherSchedule_dic);
foreach (string s in aaa.Values)
{
//todo
}
TSCommon.ComposeEIT(EIT, e.Node)方法的代码
最终原因是因为我 new System.Threading.Thread的关系new 的线程不能修改主线程的也就是界面线程的东西so,我也不知道为什么报错是报集合已经修改这个错误不过问题解决了,谢谢大家,结贴~~~