Как сделать таймер с таймаутом - PullRequest
0 голосов
/ 10 августа 2011

У меня медленный метод при выполнении его по таймеру (System.Timers.Timer). Иногда он выполняется дольше тайм-аута, что заставляет таймер ждать. Я хочу, чтобы, в то время как я установил таймер на 30 мс, например, после 30 мс, чтобы сбросить метод, а не ждать. Какой таймер мне следует использовать?

EDIT:

void OnTimerElapsed() {
      SomeMethod(args1);
      SomeMethod(args2);
      SomeMethod(args3);
}

SomeMethod находится в другой сборке. Это метод синхронизации, который запрашивает данные из другого приложения. Я не знаю, почему он иногда зависает. Это заставляет таймер приостанавливаться до тех пор, пока SomeMethod () не продолжится.

1 Ответ

1 голос
/ 10 августа 2011

Используйте System.Timers.Timer и установите для его AutoReset значение false, и запускайте его только по окончании предыдущего или в соответствии с вашими условиями. Вот образец, который я использую:

private System.Timers.Timer _timer = new System.Timers.Timer();
private volatile bool _requestStop = false;

private void InitializeTimer()
{
    _timer.Interval = 100;
    _timer.Elapced += OnTimerElapced;
    _timer.AutoReset = false;
    _timer.Start();
}

private void OnTimerElapced(object sender, System.Timers.TimerEventArgs e)
{
    //_timer.Stop();//if AutoReset was not false

    //do work....

    if (!_requestStop)
    {
        _timer.Start();//restart the timer
    }
}

private void Stop()
{
    _requestStop = true;
    _timer.Stop();
}

private void Start()
{
    _requestStop = false;
    _timer.Start();
}

Редактировать: Если вам нравится смотреть таймер и если операция занимает больше времени, то вам не следует использовать таймер, вместо этого используйте обертывание в новой операции нить и использовать MaunalResetEvent, используйте метод WaitOne, чтобы указать время ожидания, если время ожидания истекло, остановите или о операции.

...