使用System的简单示例。计时器。 C#中的定时器

时间:2013-08-20 14:05:30

标签: c# timer

我阅读了MSDN网站以及所有内容,但我找不到关于如何引发接受可能是stringdouble参数的定时事件的简单说明。提供的示例使用ElapsedEventArgs,但没有一个显示实现我自己的参数的好方法。

我的代码(我没有测试过可能是错的):

private double Pressure_Effect(double p, int t){
        time=(double) t;
        v=(((p/(rho*y))-g)*time)/(1.0+(mu*time/(rho*y*x)));
        return v;

    }
    private void Time_Handle(){
        System.Timers.Timer startTimer=new System.Timers.Timer(70);
        startTimer.Elapsed += new ElapsedEventHandler(Activate_Pressure);

    }
    private void Activate_Pressure(object source, ElapsedEventArgs e){
        pressure=2.5;
        double v=Pressure_Effect(pressure, 70);

    }

我想要做的是Activate_Pressure是多余的感觉,如果我可以将事件直接传递给Pressure_Effect,我不知道如何。我是C#的新手,所以请耐心等待。我知道我没有启用计时器,但此代码中可能缺少其他关键部分,但我刚发布它以使我的问题清楚。

2 个答案:

答案 0 :(得分:3)

因此,基于我们的评论主题,我发现这样的事情发生了:

class PressureModel
{
    private double interval = 70;
    private double pressure = 2.5;
    private DateTime startTime;
    private Timer timer;

    // assuming rho, y, g, x, and mu are defined somewhere in here?

    public PressureModel()
    {
        timer = new Timer(interval);
        timer.Elapsed += (sender, args) => PressureEvent(sender, args);
    }

    public void TimerStart() 
    {
        startTime = DateTime.Now;
        timer.Start();
    }

    public void TimerStop()
    {
        timer.Stop();
    }

    private void PressureEvent(object sender, EventElapsedArgs args)
    {
        // calculate total elapsed time in ms
        double time = (double)((args.SignalTime - startTime).TotalMilliseconds);
        // calculate v
        double v = CalculateV(time);
        //
        ... do you other work here ...
    }

    private double CalculateV(double time)
    {
        double p = this.pressure;
        // not sure where the other variables come from...
        return (((p/(rho*y))-g)*time)/(1.0+(mu*time/(rho*y*x)));
    }
}

我认为将PressureEvent分开一点是不好的。在给定某些参数的情况下,我仍然会保留一个自己计算v的函数,然后在v之后你需要做的其他事情也可以是它自己的方法。

答案 1 :(得分:2)

因此,您希望忽略传递给给定事件处理程序的一些参数,并添加一些固定值的其他参数。你刚刚展示了如何做到这一点;你创建了一个新的Timer签名方法,然后你省略了你不想要的参数,并添加了你想要的一些固定值。你认为这是一个完成你想要的相当冗长的方法是正确的。确实有一种更简洁的语法。您可以使用匿名方法,更具体地说是lambda,来执行您想要的操作。这是语法:

startTimer.Elapsed += (s, args) => Pressure_Effect(2.5, startTimer.Interval);