【问题标题】:C# System.Timers.Timer array countdownC# System.Timers.Timer 数组倒计时
【发布时间】:2022-01-24 10:59:31
【问题描述】:
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");
};

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

【问题讨论】:

    标签: c# arrays timer integer system.timers.timer


    【解决方案1】:

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

    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();
    
    • Elapsed 事件处理程序将通过传递 sender 对象来调用
    • sender 的类型是object,因此您需要将其转换为Timer
    • 该对象可用于在 timers 集合中进行查找
    • 既然你不要用ElapsedEventArgs,我建议用discard operator那里更清楚地表达你的意图

    【讨论】:

    • 非常感谢,谢谢:)
    • @PinkiePie 谢谢,如果你觉得它有用,请考虑支持它。如果您认为建议的解决方案可以解决您的问题,请考虑将其标记为答案。祝你有美好的一天!
    猜你喜欢
    • 1970-01-01
    • 2011-12-19
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多