2017-09-16 2 views
1

가 나는 그것의 핵심, 같은 방법을 호출하여 몇 네버 앤딩 루프를 실행하는 서비스있어C#의 새로운 작업에 워치 독을 구현하는 가장 좋은 방법은 무엇입니까?</p> <pre><code>public async Task DoStuffPeriodically(CancellationToken token); </code></pre> <p>그들은 호출하여 호출 :

var tokenSource = new CancellationTokenSource(); 
var stuffTask = DoStuffPeriodically(tokenSource.token); 

을 지금을이 영원히 실행됩니다 다른 방법으로 토큰을 취소하고 stuffTask.Wait()으로 전화를 걸 때만 중지됩니다. 그때 만 우리는 DoStuffPeriodically 던져 버린 수도 예외를 얻을 수 있습니다.

DoStuffPeriodically 실제로 throw하는 것이 가능합니다. 즉, 내가 기대하고있는 루프가 더 이상 실행되지 않습니다. 정기적으로 stuffTask.IsFaulted을 확인하고 (서비스를 재부팅하도록 강제 할) 예외를 던지는 메인 스레드에서 루프를 가짐으로써 모니터링을 계획하고있었습니다.

더 좋은 방법이 있나요? 어쨌든 내가 모르는 콜백을 얻으려는 경우 작업 상태를 폴링하고 싶지 않습니다.

감사합니다.

+0

사용 사례는 백그라운드에서 회전하는 단일 스레드보다 '타이머'와 유사합니다. 또 다른 좋은 옵션은 [Quartz.net] (https://github.com/quartznet/quartznet)이나 [FluentScheduler] (https://github.com/)와 같은 이런 종류의 작업을 위해 특별히 고안된 라이브러리를 사용하는 것입니다. 플루 츠 스케쥴러/FluentScheduler). 두 옵션 모두보다 강력한 예외 처리 기능을 제공하며 예외가 발생할 경우 정기적 인 작업을 중단하지 않습니다. –

+0

@Miquel은 어떤 이유로 그 스레드에 왔습니다. 우리는이 시나리오에서'Timer'를 광범위하게 사용했는데, async/await의 대부분의 사용법에 반하는 것입니다. 그러나 오류를 적절히 포착하고 더 나은 보장을 제공합니다. 독일의 옛 친구로부터의 인사 ;-) –

+0

@ThomasJungblut 우리는 Kapol의 아이디어를 사용하고 ContinueWith를 사용하여 지금까지 잘 작동하고있는 것 같습니다! 또한, 정말로 당신으로부터 소식을받는 것이 좋다. – Miquel

답변

3

Task.ContinueWith을 사용하고 TaskContinuationOptions.OnlyOnFaultedcontinuationOptions 매개 변수로 전달할 수 있습니다. 이것은 선행자가 처리되지 않은 예외를 던진 경우에만 콜백을 트리거합니다. 이 콜백에서는 플래그를 설정하거나 예외를 throw 할 수 있습니다.

stuffTask.ContinueWith(t => { throw new Exception(); }, 
    null, 
    TaskContinuationOptions.OnlyOnFaulted); 
+0

오, 훌륭해! 나는 전혀 생각하지 않았다. 감사! – Miquel