简体   繁体   English

从列表中删除计时器 <Timer> 在运行时C#

[英]Remove a Timer from List<Timer> in runtime C#

I'm trying to remove a Timer component from a List - 我正在尝试从列表中删除计时器组件-

foreach (Timer timer in timers)
{
    if (timer.Tag.ToString()=="mytag")
    {
        timer.Enabled = false;

        timer.Tick -= OnTimerTick;
        timers.Remove(timer);
    }
}

But it gives error- 但这会带来错误-

Collection was modified; enumeration operation may not execute.

Any help? 有什么帮助吗?

For unknown size you should use a list instead of an array. 对于未知大小,应使用列表而不是数组。

Try List<Timer> timers = new List<Timer>(); 尝试List<Timer> timers = new List<Timer>();

[Edit] You just changed the whole question to a new one after this answer. [编辑]在此答案之后,您只是将整个问题更改为一个新问题。 You can't remove an item inside a foreach loop. 您不能在foreach循环中删除项目。 You could use a duplicate for that list or simply iterate backwards: 您可以为该列表使用重复项,也可以向后迭代:

for (int i = timers.Count - 1; i >= 0; i--)
{
    if (timers[i].Tag.ToString()=="mytag")
    {
        timers[i].Enabled = false;
        timers[i].Tick -= OnTimerTick;
        timers.RemoveAt(i);
    }
}

You can't modify a collection in a foreach like that in C#. 您无法像在C#中那样在foreach修改集合。 You can work around this by changing: 您可以通过以下方法解决此问题:

 foreach (Timer timer in timers)
    {
        if (timer.Tag.ToString()=="mytag")
        {
            timer.Enabled = false;

            timer.Tick -= OnTimerTick;
            timers.Remove(timer);
        }
    }

To this instead: 为此:

var timersToRemove = new List<Timer>();
foreach (Timer timer in timers)
    {
        if (timer.Tag.ToString()=="mytag")
        {
            timer.Enabled = false;

            timer.Tick -= OnTimerTick;
            timersToRemove.Add(timer);
        }
    }

foreach(var timer in timersToRemove)
   timers.Remove(timer);
// Clear the list
timersToRemove.Clear();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM