如何在 TimerCallback C# 中使用参数化方法

how to user parametrized method in TimerCallback C#

我试图同时为 运行 创建多个计时器,所以我创建了列表。 我希望所有计时器都运行具有相同的功能但具有不同的参数。

private void reporting()
        {
            try
            {
               for (int i = 0; i < timers.Count; i++)
                {
                    timers[i] = new Timer(new TimerCallback(Task(i)));
                    //Set the Default Time.
                    DateTime scheduledTime = DateTime.MinValue;


                        //Set the Scheduled Time by adding the Interval to Current Time.

                        scheduledTime = DateTime.Now.AddMinutes(2);
                        if (DateTime.Now > scheduledTime)
                        {
                            //If Scheduled Time is passed set Schedule for the next Interval.
                            scheduledTime = scheduledTime.AddMinutes(2);
              
                    TimeSpan TimeSpan = scheduledTime.Subtract(DateTime.Now);

                    int dueTime = Convert.ToInt32(TimeSpan.TotalMilliseconds);

                    //Change the Timer's Due Time.
                    timers[i].Change(dueTime, Timeout.Infinite);

                }
            }
            catch (Exception ex)
            {
                
            }
        }

这是我要调用的方法

 private void Task(int index)
        {
            this.WriteToFile("*************"+ScheduleReport[index].Name+" Started*****************");

            this.WriteToFile("*************"+ScheduleReport[index].Name+" Finished successfully {0}*****************");
        }

这段代码在这一行给我一个错误

timers[i] = new Timer(new TimerCallback(Task(i)));

预期的方法名称

TimerCallback 期望一个函数接受一个 object 和 returns void.

类型的参数

您当前正在调用 Task(int) 方法,有效地尝试将 void 传递给 TimerCallback,这显然是无效的。

您需要将 Task(int) 的调用包装在另一个函数中,该函数的签名符合 TimerCallback 委托,即创建一个闭包。

实现此目的的一种方法是通过本地函数:

void InvokeTaskWithIndex(object _) => Task(i);
timers[i] = new Timer(new TimerCallback(InvokeTaskWithIndex));

但是 lambda 表达式会更简洁:

timers[i] = new Timer(new TimerCallback(_ => Task(i)));

而且您甚至不需要手动构造一个 TimerCallback 实例,因为 lambda 表达式可以隐式转换为委托:

timers[i] = new Timer(_ => Task(i));