Service 中 RunAsync 方法的 while 循环中首选什么:使用 IsCancellationRequested 或抛出异常

Mic*_*eem 5 azure-service-fabric

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

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

    await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
  }
} 
Run Code Online (Sandbox Code Playgroud)

而不是这个

protected override async Task RunAsync(CancellationToken cancellationToken)
{
  while(cancellationToken.IsCancellationRequested)
  {
    await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
  }
} 
Run Code Online (Sandbox Code Playgroud)

没有 throw 的版本不是更好吗? 文档指出这两种实现都是正确的:“系统将等待您的任务结束(通过成功完成、取消或故障)”。

Eli*_*bel 4

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

每当发生异常时RunAsync,Service Fabric都会报告暂时性故障(这意味着服务会重新启动,而不会重新创建实例/副本)。

它给予特殊处理OperationCanceledException——如果是由传递给方法的取消令牌抛出的,那么该方法被认为已经成功取消,不会报告任何错误。

您可以通过监视Microsoft-ServiceFabric-ServicesETW 事件自行尝试此操作。