2015-01-27 2 views
5

Возможно ли (или даже разумно) сделать обратный вызов System.Timers.Timer асинхронным методом? Что-то вроде:Может ли Истекший обратный вызов System.Timers.Timer быть асинхронным?

var timer = new System.Timers.Timer 
{ 
    Interval = TimeSpan.FromSeconds(30).TotalMilliseconds, 
    AutoReset = true 
}; 
timer.Elapsed += async (sender, e) => { /* await something */ }; 
timer.Start(); 

Он компилирует (очевидно, хорошее место для начала), но я не уверен, я понимаю последствия. Будет ли таймер await обратным вызовом перед сбросом таймера?

ответ

15

Будет ли таймер await обратным вызовом до сброса таймера?

Нет. Там нет ничего, что могло ждать, потому что подпись ElapsedEventHandler имеет тип возвращаемого значения аннулируются.

Другими словами, ваш код эквивалентен:

var timer = new System.Timers.Timer { ... }; 
timer.Elapsed += Foo; 
timer.Start(); 

... 
private async void Foo() 
{ 
    ... 
} 

ли это приемлемо для вас или нет, будет зависеть от контекста. В общем случае наличие асинхронных методов или анонимных функций усложняет их тестирование и повторное использование, но способность была точно указана для обработчиков событий ... Однако следует учитывать, как будут распространяться ошибки.

1

Название вопроса конкретно о таймерах, но если мы посмотрим на это как «Как вызвать метод асинхронности через некоторое время?» то вы можете сделать это, не используя таймер.

var task2 = Task.Run(async() => { 
    while (true) 
    { 
     try 
     { 
      await MyMethod2(); 
     } catch 
     { 
      //super easy error handling 
     } 
     await Task.Delay(TimeSpan.FromSeconds(5)); 
    } 
}); 

... 

public async Task MyMethod2() 
{ 
    //async work here 
} 

Пожалуйста, обратите внимание, однако, что это будет иметь различный выбор времени (таймер будет называться интервалом, приведенный выше код будет вызываться каждый (во время выполнения + sleep_time), но даже если MyMethod2 занимает много времени, это он выиграл Сказав это, вы можете рассчитать, сколько времени ждать, чтобы запустить «каждые x минут».

Смежные вопросы