我创建了一个策略,它将等待并重试:我的步骤取决于SELECT查询的输出。有时数据库需要很长的时间,大约35 - 45秒,以生成表中的值。所以,我必须等到那个时候,以检查是否值填充在数据库表或不使用波利重试。
下面是我的逻辑:
var parameters = new { PackageID = packageId };
var query = $"Select ID From Staging..Log Where StagePkg=@PackageID";
var _retryPolicy = Policy
.Handle<Exception>()
.WaitAndRetryAsync(5, retryAttempt => {
var timeToWait = TimeSpan.FromSeconds(Math.Pow(10, retryAttempt));
Console.WriteLine($"Waiting {timeToWait.TotalSeconds} seconds");
return timeToWait;
}
);
return await _retryPolicy.ExecuteAsync<BatchMailLog>(async () => await SybaseConnection.WithConnectionAsync(c => c.QueryFirstOrDefaultAsync<StageLog>(query, parameters)));
它不会像我想的那样执行:执行查询,检查查询是否返回值。如果返回值为0或null,则在15秒后重试查询,并重复此操作,直到我们从选择查询中获得值。
我收到以下错误:
系统引用为空异常:对象引用未设置为对象的示例。
发生此错误是因为它没有从查询中获取值,因此必须等待几秒钟后重试。
1条答案
按热度按时间qnakjoqk1#
如果返回值为0或null,则在15秒后重试查询,并重复此操作,直到我们从select query中获得该值
这意味着您需要按以下方式设置策略:
对于Polly,你可以用下面的方式来描述这种期望的行为: