如何使用带有取消令牌的Polly退休?

时间:2019-09-04 04:15:21

标签: c# polly

我是Polly的新手,所以可能会有一种完全不同的方法,这就是我要尝试做的事情,这完全可以。

我的目标是:

  1. token可能由于超时或请求而被取消
  2. 永久重试,直到成功或token被取消。
  3. 请求取消等待时,应立即退出

尽管我使用的方法可行,但似乎缺少了一些东西,可能有更好/更干净的方法来完成我想要的事情。我特别在考虑这一行.WaitAndRetryForever(retryAttempt => TimeSpan.Zero,。我觉得我应该可以在此处而不是通过retryDelay传递TimeSpan.Zero,但是如果我这样做,那么在请求取消时它不会返回,直到retryDelay完成等待而不是立即完成如我所愿。

我确实看到.Execute看起来可以用取消令牌执行某些操作,但是我不知道如何使用它,所以如果这是我的答案,请忽略我的其他问题。

仅在Polly NuGet开发人员之一看到此错误的情况下,我期望看到的是WaitAndRetryForever的重载,该重载使用取消标记作为参数,因此如果被取消,它可以立即返回。我不愿提出正式建议,因为我对Polly还是很陌生,所以我不确定这是否有意义。

这是我目前正在使用的方法:

internal static void Retry(Action action, TimeSpan retryDelay, CancellationToken token)
{
    try
    {
        Policy
            .Handle<IOException>()
            .WaitAndRetryForever(retryAttempt => TimeSpan.Zero,
                (ex, delay, context) =>
                {
                    Task.Delay(retryDelay, token).GetAwaiter().GetResult();
                    token.ThrowIfCancellationRequested();
                    //Log exception here
                })
            .Execute(() =>
            {
                token.ThrowIfCancellationRequested();
                action.Invoke();
            });
    }
    catch (OperationCanceledException)
    {
        //Log cancellation here
        throw;
    }
    catch (Exception ex)
    {
        //Log exception here
        throw;
    }
}

1 个答案:

答案 0 :(得分:1)

Execute的重载需要CancellationToken

.Execute((ct) =>
{
    ct.ThrowIfCancellationRequested();
    action.Invoke();
}, token);

此令牌还将应用于WaitAndRetryForever内处理的延迟。

Try it online