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
集合中进行查找 - 由于你不使用
Elapsed
的EventArgs
,我建议在那里使用丢弃运算符来更清楚地表达你的意图