我正在使用System.Timers.Timer
类创建一个带有Timer.Elapsed
事件的计时器。事情是Timer.Elapsed
事件仅在间隔时间过后才首次触发。
有没有办法在启动计时器后立即引发Timer.Elapsed
事件?
我在System.Timers.Timer
课程中找不到任何相关属性。
答案 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)