Получить индекс элемента в списке элементов класса с элементом таймера
Я пытаюсь найти индекс сработавшего таймера.
Я создал список записи класса здесь в Program.cs
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
}
Элементы в списке создаются случайным образом. Теперь запускается каждый таймер в списке (индекс списка), а затем через 10000 мсек вызывается CallDeleteEntry.
Что мне нужно сделать, это передать индекс таймера, когда он проходит 10000 мс, в CallDeleteEntry, чтобы он мог удалить эту строку элемента для списка.
Я думаю, что-то должно быть изменено здесь, чтобы это работало.
idleTimeOutTimer.Elapsed += (sender, e) => CallDeleteEntry(sender, e, Program.Table.IndexOf());
Список будет выглядеть так
ListIndex | Элемент входа
0 | ПКТ | pktTimer
1 | ПКТ | pktTimer
2 | ПКТ | pktTimer
3 | ПКТ | pktTimer
4 | ПКТ | pktTimer
2 ответа
Ваш довольно близкий IndexOf требует элемент, индекс которого вы пытаетесь получить. в этом случае класс Entry, для которого вы пытаетесь получить индекс. Я считаю, что в вашем случае это будет ключевым словом this, поэтому IndexOf (this).
https://msdn.microsoft.com/en-us/library/8bd0tetb(v=vs.110).aspx
@ Джейсон Мастник
Что вызвало вышеуказанную ошибку, о которой я упоминал в комментариях к вам, было
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 - "1", а не "0". Поскольку первый элемент добавлен в индекс 0. Он должен быть первым, который будет удален в этом последовательном сценарии. Все работает хорошо, ожидайте, что этот первый элемент в индексе 0 не будет удален. Есть идеи?