如何在 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));
我试图同时为 运行 创建多个计时器,所以我创建了列表。 我希望所有计时器都运行具有相同的功能但具有不同的参数。
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));