Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将参数传递给计时器_Tick事件_C#_Events_Parameters_Timer - Fatal编程技术网

C# 将参数传递给计时器_Tick事件

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

我想把一些参数传递给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 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;
}