Подтвердить что ты не робот

Как запустить таймер. Немедленное событие

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

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

Я не смог найти соответствующее свойство в классе System.Timers.Timer.

4b9b3361

Ответ 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); });

После создания/настройки таймера, работала отлично для меня...