我试图找到触发定时器的索引。
我在Program.cs中创建了一个Class Entry列表
static public List<Entry> Table = new List<Entry>();
这是名为“Entry”的类,其构造函数在Entry.cs
中public class Entry
{
public int pktID;
public Timer pktTimer= new Timer();
}
public Entry()
{
}
public Entry(int _pktID, Boolean idleTimeOutStart)
{
this.pktID = _pktID;
if (idleTimeOutStart == true)
{
pktTimer.Elapsed += (sender, e) => CallDeleteEntry(sender, e, Program.Table.IndexOf());
pktTimer.Interval = 10000; // 10000 ms is 10 seconds
pktTimer.Start();
}
}
static void CallDeleteEntry(object sender, System.Timers.ElapsedEventArgs e, int pktIndex)
{
Program.Table.RemoveAt(pktIndex); //Removes Entry at this Index
Program.Table[pktIndex].idleTimeOutTimer.Stop(); //Stops idleTimeOutTimer of This Entry
}
列表中的项目是随机创建的。现在List(List Index)中的每个Timer将启动,然后在10000 msecs之后,将调用CallDeleteEntry。
我需要做的是将计时器的索引经过10000毫秒传递给CallDeleteEntry,这样就可以删除列表中的项目行。
我认为必须在此修改某些内容才能使其正常运行。
idleTimeOutTimer.Elapsed += (sender, e) => CallDeleteEntry(sender, e, Program.Table.IndexOf());
列表将如下所示
答案 0 :(得分:1)
您非常接近的IndexOf需要您尝试获取索引的项目。在这种情况下,您尝试获取索引的Entry类。我相信你的情况就是关键词,所以IndexOf(this)。
https://msdn.microsoft.com/en-us/library/8bd0tetb(v=vs.110).aspx
答案 1 :(得分:0)
@Jason Mastnick
我在评论中提到的上述错误导致了
Program.Table.RemoveAt(pktIndex); //Removes Entry at this Index
Program.Table[pktIndex].idleTimeOutTimer.Stop(); //Stops idleTimeOutTimer of This Entry
我应该先停止计时器,然后删除数据包
Program.Table[pktIndex].idleTimeOutTimer.Stop(); //Stops idleTimeOutTimer of This Entry
Program.Table.RemoveAt(pktIndex); //Removes Entry at this Index
顺便说一句,您的解决方案有效。我应该这样写。
pktTimer.Elapsed += (sender, e) => CallDeleteEntry(sender, e, Program.Table.IndexOf(this));
然而,出现问题。我尝试按顺序在列表中添加条目。传递的第一个pktIndex是&#34; 1&#34;不是&#34; 0&#34;。由于第一个项目是在索引0处添加的。它应该是在此顺序方案中首先删除的项目。一切正常,期望索引0的第一项不会被删除。有什么想法吗?