将参数传递给timer_Tick事件

时间:2014-02-05 22:34:40

标签: c# events parameters timer

我想将一些参数传递给c#中的事件timer_tick,但我不想让它们成为全局变量。这可能吗?

我看了一眼,想出了类似的东西:

//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      
}

非常感谢! 路加。

3 个答案:

答案 0 :(得分:1)

是的,但不是那样的。您可以通过继承EventArgs

来定义类
class MyEventArgs : EventArgs
{
    public int dest { get; set; }
    public int current { get; set; }
}

然后你需要手动触发Tick事件并传递如下参数:

lift1Up_Tick(this, new MyEventArgs { dest = 23, current = 100 });

在tick事件中你可以得到这个论点:

private void lift1Up_Tick(object sender, EventArgs e)
{
    var args = (MyEventArgs)e;
    int dest = args.dest;     
}

我不知道有没有更好的方法。要做到这一点(manuel触发器)你可以添加另一个timer.Set它的间隔然后在它的Tick事件中写下这段代码:

lift1Up_Tick(this, new MyEventArgs { dest = 23, current = 100 });

答案 1 :(得分:1)

你可以只使用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;
}

答案 2 :(得分:0)

是的,您可以使用 Lambda函数,如上述示例所示。 Lambda函数是嵌套函数的一种形式,因为它们允许访问包含函数范围内的变量。 Lambda表达式定义为:

(input parameters) => expression; 
(input parameters) => {statement block}; 

因此,您可以执行任何表达式或语句块(如调用方法),并且可以查看范围的所有变量(包括事件变量),而无需使其成为全局变量。