azure-service-fabric - 服务 : use IsCancellationRequested or throw exception 中 RunAsync 方法的 while 循环中什么是首选

标签 azure-service-fabric

为什么新 Service Fabric 代码的示例 RunAsync 结构如下

protected override async Task RunAsync(CancellationToken cancellationToken)
{
  while(true)
  {
    cancellationToken.ThrowIfCancellationRequested();

    await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
  }
} 

而不是这个
protected override async Task RunAsync(CancellationToken cancellationToken)
{
  while(cancellationToken.IsCancellationRequested)
  {
    await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
  }
} 

没有 throw 的版本不是首选吗?
The docs声明两个实现都是正确的:“系统将等待您的任务结束(通过成功完成、取消或错误)”。

最佳答案

简短的回答 - 两者都很好。我会用 ThrowIfCancellationRequested因为 IMO 这是更安全的选择。它也更加一致 - 调用链中较低的方法可以通过异常传播取消。

每当 RunAsync 中发生异常时, 服务结构 reports暂时性故障(这意味着服务在没有重新创建实例/副本的情况下重新启动)。

它对 OperationCanceledException 给予特殊处理- 如果是由传递给该方法的取消 token 抛出,则认为该方法已成功取消,不会报告任何错误。

您可以通过监控 Microsoft-ServiceFabric-Services 自己尝试一下。 ETW 事件。

关于azure-service-fabric - 服务 : use IsCancellationRequested or throw exception 中 RunAsync 方法的 while 循环中什么是首选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37525108/

相关文章:

azure-service-fabric - 在另一个区域中使用 keyvault 的比例集

azure-service-fabric - Service Fabric可靠的队列长时间运行

asp.net-web-api - 在 Service Fabric 中公开 Web API

c# - 通过 Service Fabric 项目调试时未使用环境变量

azure - Azure Service Fabric 上有许多日志文件

azure-service-fabric - 更新单服务

Azure Service Fabric 中的 Java Spring Boot

azure - Service Fabric 群集节点无法从证书获取私钥

c# - 如何找到 Service Fabric 应用程序服务与节点的关联?

azure - 无法将管理客户端 key 添加到 Service Fabric 群集