C#System.Timers.Timer数组倒计时


static void Main()
{
int timersLength = 4;
int interval = 1000;
int[] timerNum = new int[timersLength];
Timer[] timers = new Timer[timersLength];
for (int i = 0; i < timersLength; i++)
{
timerNum[i] = i;
timers[i] = new Timer(interval);
//Console.WriteLine($"Timer {timerNum[i]} is running");
timers[i].Elapsed += (o, e) =>
{
Console.WriteLine($"Timer {timerNum[i]} is running");
};
}
foreach (Timer timer in timers)
timer.Start();
Console.ReadKey();
}

每当我试图对Timer数组进行倒计时时,它都会给出

"System.IndexOutOfRangeException:"索引超出了数组的界限">

运行线上的

timers[i].Elapsed += (o, e) =>
{
Console.WriteLine($"Timer {timerNum[i]} is running");
};

代码看起来很好,但由于某种原因,它给出了这个错误。

如果您不想创建一个类来将Timer的名称存储在它旁边,那么您可以简单地创建一个Dictionary<Timer, string>集合来进行映射。

Dictionary<Timer, string> timers = new Dictionary<Timer, string>(timersLength);
for (int i = 0; i < timersLength; i++)
{
var timer = new Timer(interval);
timers[timer] = $"Timer {i}";
timer.Elapsed += (sender, _) => Console.WriteLine($"{timers[(Timer)sender]} is running");
}
foreach (KeyValuePair<Timer, string> mapping in timers)
mapping.Key.Start();
  • 将通过传递sender对象来调用Elapsed事件处理程序
  • sender的类型是object,因此需要将其强制转换为Timer
  • 该对象可用于在timers集合中进行查找
  • 由于你不使用ElapsedEventArgs,我建议在那里使用丢弃运算符来更清楚地表达你的意图

最新更新