【发布时间】:2016-09-28 06:00:59
【问题描述】:
为什么新 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 声明两种实现都是正确的:“系统将等待您的任务结束(通过成功完成、取消或故障)”。
【问题讨论】:
-
我对Service Fabric还不是很熟悉,但是设置
CancellationToken的预期语义是抛出OperationCanceledException如果它被取消,然后返回如果取消太晚了。他们可能只是为了保持一致性而使用此代码,或者 Service Fabric 可能会根据RunAsync的完成方式来更改其自我修复的方式。 -
是的,这主要是为什么我们将示例代码更改为抛出 OperationCanceledException,其中 RunAsync 中的连续循环被 Service Fabric 通过发出取消令牌信号中断,因为 RunAsync 循环正在被取消,这是预期的语义。通过向系统报告故障,对其他异常类型进行不同的处理以进行自我修复。