.net C# Polly WaitandRetry或延迟后重试

ldioqlga  于 2022-12-20  发布在  .NET
关注(0)|答案(1)|浏览(319)

我创建了一个策略,它将等待并重试:我的步骤取决于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秒后重试查询,并重复此操作,直到我们从选择查询中获得值。
我收到以下错误:
系统引用为空异常:对象引用未设置为对象的示例。
发生此错误是因为它没有从查询中获取值,因此必须等待几秒钟后重试。

qnakjoqk

qnakjoqk1#

如果返回值为0或null,则在15秒后重试查询,并重复此操作,直到我们从select query中获得该值
这意味着您需要按以下方式设置策略:

  • 触发器:* 如果返回值为0或null*
  • 睡眠持续时间:* 15秒后重试查询 *
  • 次数:* 直到我们从选择查询中获得值 *

对于Polly,你可以用下面的方式来描述这种期望的行为:

var retry = Policy
    .HandleResult<BatchMailLog>(b => (b?.XYZ ?? 0) == 0) //Trigger
    .WaitAndRetryForeverAsync( //Times
      _ => TimeSpan.FromSeconds(15)); //Sleep duration

相关问题