【发布时间】:2018-01-29 02:24:33
【问题描述】:
我正在使用 List 实现代码。每个列表都有一个类类型项。此类的成员之一是名为“TimeOut”的 System.Timer.Timer 变量。 TimeOut.Interval 的值为 10,TimeOut.Elapsed 事件应该在每个 TimeOut.Interval(即 10)触发一次。
事件是从列表中删除该项目。事件被重载使得
TimeOut.Elapsed += (sender, e) => DeleteEntry(sender, e, i)
其中 i 是列表中项目的索引。
对于事件方法,
public void DeleteEntry(object sender, System.Timers.ElapsedEventArgs e, int i)
{
//Delete Item from List
listTable.RemoveAt(i);
}
我的问题是,如果两个项目一起启动它们的计时器并决定在相同的指定间隔后调用 EventHandler,则首先添加到列表中的一个被删除,然后当第二个被立即调用时,它会抛出一个错误告诉我索引超出范围。发生这种情况是因为其中一个项目被删除,列表向上移动了它的索引,并且发送到 DeleteEntry 方法的“i”是不再存在的旧项目。
在其他情况下,当列表中有两个以上的项目时,它会删除错误的项目,因为该方法使用了错误的索引。
使用数组不是我的选择。每次删除元素时都需要对数组进行碎片整理。
我该如何解决这个问题?我是否需要对 ThreadPool 做一些事情,设置一个标志或类似的东西? SynchronizingObject 属性有帮助吗?
谢谢。
【问题讨论】:
-
您应该找到除索引以外的方法来识别您的列表项,或者 - 您的多个计时器事件应该只收集索引并且唯一的一个专用计时器事件应该删除它们(但这涉及更多同步开销)
标签: c# timer threadpool eventhandler