Как запустить timer.Elapsed событие сразу - PullRequest
51 голосов
/ 03 августа 2011

Я использую класс System.Timers.Timer для создания таймера с событием Timer.Elapsed. Дело в том, что событие Timer.Elapsed запускается впервые только по истечении интервала времени.

Есть ли способ вызвать событие Timer.Elapsed сразу после запуска таймера?

Я не смог найти подходящую недвижимость в классе System.Timers.Timer.

Ответы [ 9 ]

30 голосов
/ 03 августа 2011

Просто вызовите метод Timer_Tick самостоятельно.


Если вы не хотите иметь дело с параметрами метода обратного вызова Tick, просто поместите код, который был в вашем Timer_Tick, в другойи вызовите его из Timer_Tick и сразу после Timer.Start() вызова


Как указывалось @Yahia, вы также можете использовать таймер System.Threading.Timer, которыйвы можете установить начальную задержку на 0. Имейте в виду, что обратный вызов будет выполняться в другом потоке, в отличие от обратного вызова на Windows.Forms.Timer, который выполняется в потоке пользовательского интерфейса. Так что есливы обновляете любые элементы управления пользовательским интерфейсом, используя System.Threading.Timer (без правильного вызова), это приводит к сбою.

18 голосов
/ 02 ноября 2012

Я только что позвонил **ElapsedEventHandler** с нулевыми параметрами.

11 голосов
/ 02 июня 2015

Я знаю, что этот ответ запоздал, но если вы хотите, чтобы ваш 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();
}
10 голосов
/ 03 августа 2011

не уверен насчет 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 голосов
/ 24 июля 2017

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

После создания / настройки таймера у меня все работало нормально ...

4 голосов
/ 03 августа 2011

Если вы хотите иметь возможность вызывать событие в любое время (не только в момент, когда вы запускаете таймер), вы можете инкапсулировать таймер в свой собственный класс 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);
    }
}
3 голосов
/ 23 января 2018

В первый раз таймер запустится через 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
        .
        .
        .
    }
0 голосов
/ 19 ноября 2018

Вот простой ответ .(Предполагая, что вы используете форму Windows)

После перетаскивания элемента управления таймером на форму установите для свойства enabled значение true, а для свойства Interval - начальное значение.(100 является значением по умолчанию и немедленно запускает тиковое событие)

enter image description here

Затем в своем тиковом событии просто проверьте значение свойства Interval.Если это не ваше желаемое значение, установите его. Это так просто .То же самое можно сделать в коде C #, если создать таймер на лету.

enter image description here

0 голосов
/ 19 марта 2014

Я реализовал в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...