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 的版本不是更好吗? 文档指出这两种实现都是正确的:“系统将等待您的任务结束(通过成功完成、取消或故障)”。
简短的回答 - 两者都很好。我会使用,ThrowIfCancellationRequested因为在我看来,这是更安全的选择。它也更加一致 - 调用链中较低的方法可以通过异常传播取消。
每当发生异常时RunAsync,Service Fabric都会报告暂时性故障(这意味着服务会重新启动,而不会重新创建实例/副本)。
它给予特殊处理OperationCanceledException——如果是由传递给方法的取消令牌抛出的,那么该方法被认为已经成功取消,不会报告任何错误。
您可以通过监视Microsoft-ServiceFabric-ServicesETW 事件自行尝试此操作。
| 归档时间: |
|
| 查看次数: |
1398 次 |
| 最近记录: |