为什么新 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/