如何立即触发timer.Elapsed事件

时间:2011-08-03 09:08:01

标签: c# events timer

我正在使用System.Timers.Timer类创建一个带有Timer.Elapsed事件的计时器。事情是Timer.Elapsed事件仅在间隔时间过后才首次触发。

有没有办法在启动计时器后立即引发Timer.Elapsed事件?

我在System.Timers.Timer课程中找不到任何相关属性。

10 个答案:

答案 0 :(得分:30)

请自行调用Timer_Tick方法。


如果您不想处理Tick回调方法的参数,那么只需将Timer_Tick中的代码放入另一个方法中,然后从Timer_Tick中调用它,并在{{1}之后调用调用


正如@Yahia指出的那样,你也可以使用System.Threading.Timer计时器,你可以将其设置为初始延迟为0. 请注意,回调将在不同的线程上运行,而不是在UI线程上运行的Timer.Start()上的回调。因此,如果使用System.Threading.Timer更新任何UI控件(没有正确调用),它将崩溃。

答案 1 :(得分:18)

我刚刚使用null参数调用**ElapsedEventHandler**

答案 2 :(得分:10)

不确定System.Timers.Timer但请尝试

System.Threading.Timer T = new System.Threading.Timer(new TimerCallback(DoSomething), null, 0, 30000);

立即启动(首次运行时为0毫秒,后续运行时为30000毫秒)...


http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx
http://msdn.microsoft.com/en-us/library/2x96zfy7.aspx

答案 3 :(得分:10)

我知道这个答案很晚但如果你希望你的System.Timers.Timer在100毫秒(默认间隔)内被解雇,那么你只需要在没有指定间隔的情况下初始化Timer对象,然后设置间隔在被调用的函数内,无论你喜欢什么。以下是我在Windows服务中使用的示例:

private static Timer _timer;

protected override void OnStart(string[] args)
{
    _timer = new Timer(); //This will set the default interval
    _timer.AutoReset = false;
    _timer.Elapsed = OnTimer;
    _timer.Start();
}

private void OnTimer(object sender, ElapsedEventArgs args)
{
    //Do some work here
    _timer.Stop();
    _timer.Interval = 50000; //Set your new interval here
    _timer.Start();
}

答案 4 :(得分:4)

如果您希望能够随时提升事件(不仅仅是在您启动计时器的那一刻),您可以将计时器封装在您自己的MyTimer类中。该类公开了原始的Timer方法和属性。此外,我添加了一个带有显式添加和删除的事件。这样,无论何时向事件添加委托,都会将其添加到私有MyTimer事件和原始计时器Elapsed事件中。这意味着计时器以通常的方式触发Elapsed,但您可以手动触发调用RaiseElapsed的事件(这听起来应该更简单一些)。

public class MyTimer
{
    Timer t = new Timer();
    event ElapsedEventHandler timerElapsed;

    public event ElapsedEventHandler Elapsed
    {
        add
        {
            t.Elapsed += value;
            timerElapsed += value;
        }
        remove
        {
            t.Elapsed -= value;
            timerElapsed -= value;
        }
    }

    public double Interval
    {
        get
        {
            return t.Interval;
        }
        set
        {
            t.Interval = value;
        }
    }

    public void Start()
    {
        t.Start();
    }

    public void Stop()
    {
        t.Stop();
    }

    public void RaiseElapsed()
    {
        if (timerElapsed != null)
            timerElapsed(null, null);
    }
}

答案 5 :(得分:3)

Task.Run(() => { Timer_Elapsed(null, null); });

定时器创建/配置后,对我来说很好......

答案 6 :(得分:2)

第一次,计时器将在1秒后启动。之后,它的间隔将改为每30秒或任何......

    //main function    
    Timer timer = new Timer(1000);   //initial start after 1 second
        timer.Elapsed += new ElapsedEventHandler(TimerElapsedMethod);
        timer.Start();            
    }
    private void TimerElapsedMethod(object sender, ElapsedEventArgs e) 
    {
        Timer timer = (Timer)sender; // Get the timer that fired the event
        timer.Interval = 30000;      // Change the interval to whatever
        .
        .
        .
    }

答案 7 :(得分:0)

我已在VB.NET中使用AddHandler实现

Public Class clsMain Inherits ServiceBase

Protected Overrides Sub OnStart(ByVal args() As String)
' Add code here to start your service. This method should set things
' in motion so your service can do its work.
gTimer.Interval = 1000  
gTimer.Enabled = True
AddHandler gTimer.Elapsed, AddressOf gTimer_Elapsed
End Sub

'When the timer is elapsed this event will be fired

Protected Sub gtimer_Elapsed(ByVal source As Object, ByVal e As ElapsedEventArgs)
'Stop the timer and do some work
gTimer.Stop()
'Custom code
'Here
'Start to raise the elapsed event again
gTimer.Start()
End Sub
End Class

答案 8 :(得分:0)

我不是专业人士,所以可以加少许盐服用,但是可以用。我创建了一个函数,而不是将代码放入timer子例程中,而是将其放入函数中。然后,我只是在需要时调用了该函数(在我的情况下是在页面加载时),然后计时器代码将在间隔时间触发,并仅在计时器子代码中调用该函数。

答案 9 :(得分:-1)

这是简单的答案 。 (假设您使用的是Windows表单)

将计时器控件拖到窗体上后,将enabled属性设置为true,将Interval属性设置为您希望初始值是任何值。 (默认值为100,它将立即启动滴答事件)

enter image description here

然后在您的tick事件中,只需检查Interval属性的值。如果不是您想要的值,请设置它。 就这么简单。如果即时创建计时器,则可以在C#代码中完成相同的操作。

enter image description here