如何立即触发timer.Elapsed事件
我正在使用System.Timers.Timer
类创buildTimer.Elapsed
事件的计时器。 事情是Timer.Elapsed
事件只有在间隔时间过后才会被第一次触发。
有没有办法在启动计时器后立即boostTimer.Elapsed
事件?
我无法findSystem.Timers.Timer
类中的任何相关的属性。
只需要调用Timer_Tick
方法。
如果您不想处理Tickcallback方法的参数,那么只需将Timer_Tick
的代码放入另一个方法中,然后从Timer_Tick和Timer.Start()
调用该方法
正如@Yahia指出的那样,你也可以使用System.Threading.Timer
定时器,你可以设置它的初始延迟为0. 请注意,尽pipe如此,callback将运行在不同的线程,而不是callback在UI线程上运行的Windows.Forms.Timer
。 所以如果你使用System.Threading.Timer
更新任何UI控件(没有正确调用),它会崩溃。
我只是用空参数调用**ElapsedEventHandler**
。
不知道关于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
我知道这个答案已经晚了,但是如果你想让你的System.Timers.Timer
在100ms(默认的时间间隔)内被触发,那么你可以简单地在没有指定时间间隔的情况下初始化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(); }
如果您希望能够随时启动事件(不仅在您启动计时器的那一刻),您可以在您自己的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); } }
我用AddHandler在VB.NET中实现
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
Task.Run(() => { Timer_Elapsed(null, null); });
定时器创build/configuration后,工作正常我…