2015-01-27 5 views
5

System.Timers.Timer의 콜백을 비동기 메소드로 만들 수 있습니까? 예 :System.Timers.Timer의 경과 콜백을 async로 설정할 수 있습니까?

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() 
{ 
    ... 
} 

: 즉

, 당신의 코드는 동일합니다. 일반적으로 비동기 void 메소드 또는 익명 함수를 사용하면 테스트하고 재사용하기가 더 어려워집니다. 그러나 이벤트 핸들러를 위해 정확하게 주어진 능력은 ... 오류가 전파되는 방식을 고려해야합니다.

1

질문 제목은 Timers에 관한 것이지만 "시간이 지나면 비동기 메서드를 호출하는 방법"으로 보시면됩니다. 그러면 타이머를 사용하지 않고도 할 수 있습니다.

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 분마다'를 실행할 수있는 시간을 계산할 수 있습니다.