Как запустить таймер. Немедленное событие
Я использую класс System.Timers.Timer
для создания таймера с событием Timer.Elapsed
. Дело в событии Timer.Elapsed
запускается в первый раз только после того, как прошло время интервала.
Есть ли способ поднять событие Timer.Elapsed
сразу после запуска таймера?
Я не смог найти соответствующее свойство в классе System.Timers.Timer
.
Ответы
Ответ 1
Просто вызовите метод Timer_Tick
самостоятельно.
Если вы не хотите иметь дело с параметрами метода обратного вызова Tick, просто поместите код, который был в вашем Timer_Tick
, в другой метод и вызовите это из Timer_Tick и сразу после вызова Timer.Start()
Как указано в @Yahia, вы также можете использовать таймер System.Threading.Timer
, который вы можете установить на начальную задержку до 0. Помните, однако, что обратный вызов будет работать в другом потоке, в отличие от обратного вызова в Windows.Forms.Timer
, который работает в потоке пользовательского интерфейса. Поэтому, если вы обновляете элементы управления пользовательским интерфейсом с помощью System.Threading.Timer
(без правильного вызова) он сработает.
Ответ 2
Я просто вызвал **ElapsedEventHandler**
с нулевыми параметрами.
Ответ 3
не уверен в 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
Ответ 4
Я знаю, что этот ответ задерживается, но если вы хотите, чтобы ваш 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();
}
Ответ 5
Если вы хотите, чтобы вы могли поднимать событие, когда захотите (не только в момент запуска таймера), вы можете инкапсулировать таймер в свой собственный класс MyTimer. Этот класс предоставляет оригинальные методы и свойства таймера. Кроме того, я добавил событие с явным добавлением и удалением. Таким образом, всякий раз, когда вы добавляете делегата в событие, это добавляется как к закрытому событию MyTimer, так и к исходному таймеру Истекшее событие. Это означает, что таймер запускает 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);
}
}
Ответ 6
Я реализовал в 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
Ответ 7
Task.Run(() =>
{
Timer_Elapsed(null, null);
});
После создания/настройки таймера, работала отлично для меня...