c# - 如何在 C# 中对永无休止的任务最好地实现看门狗?

标签 c# task-parallel-library

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

public async Task DoStuffPeriodically(CancellationToken token);

它们通过调用来调用:

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

现在,这将永远运行,并且只有当我们在不同的方法上取消 token 并调用 stuffTask.Wait() 时才会停止。 只有这样我们才会得到 DoStuffPeriodically 可能引发的任何异常。

DoStuffPeriodically 有可能(但不太可能)实际抛出异常,这意味着我所依赖的循环不再运行。我计划通过在主线程中设置一个循环来监视它,该循环定期检查 stuffTask.IsFaulted 并抛出异常(这将强制服务重新启动)。

有更好的方法吗?如果我不知道可以从中获取回调,我不想轮询任务状态。

谢谢!

最佳答案

您可以使用Task.ContinueWith ,将 TaskContinuationOptions.OnlyOnFaulted 传递给 continuationOptions 参数。仅当先行抛出未处理的异常时,才会触发回调。在此回调中,您可以设置一些标志或引发异常。

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

关于c# - 如何在 C# 中对永无休止的任务最好地实现看门狗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46252186/

相关文章:

c# - 如何在 C# 中渲染带有颜色键控的绿色蒙版的图像?

c# - STL C++ 和 C# 容器之间的映射

c# - 如何将此同步方法转换为返回任务的方法?

c# - 为什么抛出 TaskCanceledException 并不总是闯入调试器

c# - 实现返回 Task<T> 的方法的正确方法

c# - 如何在UWP中解压文件

c# - 如何获取 WCF 服务的监听地址/端口?

c# - 是否有 `Task.Delay` 的变体在实时通过后过期,例如即使系统暂停和恢复?

c# - 使用 Process.Start() 打开文件夹时访问被拒绝异常

c# - 有通用的 Task.WaitAll 吗?