我有一个服务,它的核心是通过调用以下方法来运行一些永无止境的循环:

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);

07-28 08:12