C# 将参数传递给计时器_Tick事件
我想把一些参数传递给c中的事件计时器,但我不想让它们成为全局变量。这可能吗 我环顾四周,得出了这样的结论:C# 将参数传递给计时器_Tick事件,c#,events,parameters,timer,C#,Events,Parameters,Timer,我想把一些参数传递给c中的事件计时器,但我不想让它们成为全局变量。这可能吗 我环顾四周,得出了这样的结论: //Where I start the timer lift1Up.Enabled = true; lift1Up.Tick += (sender, args) => lift1Up_Tick(sender, args, destination, currentFloor); lift1Up.Start(); private void lift1Up_Tick(object sen
//Where I start the timer
lift1Up.Enabled = true;
lift1Up.Tick += (sender, args) => lift1Up_Tick(sender, args, destination, currentFloor);
lift1Up.Start();
private void lift1Up_Tick(object sender, EventArgs e, int dest, int current)
{
//my code
}
lift1Up_Tick(this, new MyEventArgs { dest = 23, current = 100 });
非常感谢!
卢克。是的,但不是那样。可以通过继承来定义类 然后您需要手动触发
勾选事件并传递如下参数:
//Where I start the timer
lift1Up.Enabled = true;
lift1Up.Tick += (sender, args) => lift1Up_Tick(sender, args, destination, currentFloor);
lift1Up.Start();
private void lift1Up_Tick(object sender, EventArgs e, int dest, int current)
{
//my code
}
lift1Up_Tick(this, new MyEventArgs { dest = 23, current = 100 });
在勾选事件中,您可以得到以下参数:
private void lift1Up_Tick(object sender, EventArgs e)
{
var args = (MyEventArgs)e;
int dest = args.dest;
}
我不知道有没有更好的方法。要做到这一点(manuel trigger),您可以添加另一个计时器。设置它的间隔,然后在它的滴答事件中写入以下代码:
lift1Up_Tick(this, new MyEventArgs { dest = 23, current = 100 });
是的,您可以使用Lambda函数,如前面提到的示例中所用。Lambda函数是嵌套函数的一种形式,因为它们允许访问包含函数范围内的变量。Lambda表达式定义为:
(input parameters) => expression;
(input parameters) => {statement block};
因此,您可以执行任何表达式或语句块,如call method,同时可以看到作用域中的所有变量,包括事件变量,而无需将它们设置为全局变量。您只需使用lambda作为事件处理程序,并从中访问局部变量,C#编译器将发挥神奇的作用:
void StartTimer()
{
EventHandler tickHandler = null;
var destination = 5, currentFloor = 0;
tickHandler = (sender, args) =>
{
if (currentFloor == destination)
{
lift1Up.Enabled = false;
lift1Up.Tick -= tickHandler;
MessageBox.Show("Arrived!");
}
else
currentFloor++;
}
// start the timer
lift1Up.Tick += tickHandler;
lift1Up.Enabled = true;
}