我有一个服务,它的核心是通过调用以下方法来运行一些永无止境的循环:
public async Task DoStuffPeriodically(CancellationToken token);
它们通过调用来调用:
var tokenSource = new CancellationTokenSource();
var stuffTask = DoStuffPeriodically(tokenSource.token);
现在,它将永久运行,并且只有在使用另一种方法取消令牌并调用
stuffTask.Wait()
时才会停止。只有这样,我们才能获得DoStuffPeriodically可能抛出的所有异常。DoStuffPeriodically实际上可能(但不太可能)抛出,这意味着我所指望的循环不再运行。我正计划通过在主线程中存在一个循环来对其进行监视,该循环会定期检查
stuffTask.IsFaulted
并引发异常(这将迫使服务重新启动)。有一个更好的方法吗?如果有任何我不知道的回调方法,我不想轮询任务状态。
谢谢!
最佳答案
您可以使用Task.ContinueWith,将TaskContinuationOptions.OnlyOnFaulted
传递给continuationOptions
参数。仅当前者引发未处理的异常时,这才触发回调。在此回调中,您可以设置一些标志或引发异常。
stuffTask.ContinueWith(t => { throw new Exception(); },
null,
TaskContinuationOptions.OnlyOnFaulted);