C# 如何使用Polly进行取消令牌重试?
我是波利的新手,所以可能会有一种与我尝试的完全不同的方法,这是完全可以接受的 我的目标是:C# 如何使用Polly进行取消令牌重试?,c#,polly,C#,Polly,我是波利的新手,所以可能会有一种与我尝试的完全不同的方法,这是完全可以接受的 我的目标是: 令牌可能因超时或请求而取消 永远重试,直到取消成功或标记 请求取消时,应立即退出等待 虽然我所使用的方法似乎有些遗漏,但可能有更好/更干净的方法来实现我的目标。我特别想到这一行(retrytry=>TimeSpan.Zero,。我觉得我应该能够在这里传递retryDelay,而不是TimeSpan.Zero但是如果我在请求取消时这样做,它不会返回,直到retryDelay完成等待,而不是像我希望的那样立即
令牌
可能因超时或请求而取消标记
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;
}
}
内部静态无效重试(操作操作、TimeSpan retryDelay、CancellationToken令牌)
{
尝试
{
政策
.Handle()
.WaitAndRetryForever(retrytry=>TimeSpan.Zero,
(例如,延迟、上下文)=>
{
Task.Delay(retryDelay,token).GetAwaiter().GetResult();
token.ThrowIfCancellationRequested();
//此处记录异常
})
.Execute(()=>
{
token.ThrowIfCancellationRequested();
action.Invoke();
});
}
捕获(操作取消异常)
{
//在这里取消日志
投掷;
}
捕获(例外情况除外)
{
//此处记录异常
投掷;
}
}
超负荷的Execute
会使用取消令牌
:
.Execute((ct) =>
{
ct.ThrowIfCancellationRequested();
action.Invoke();
}, token);
此令牌还将应用于WaitAndRetryForever
内处理的延迟
我不知道如何读取IntelliSense。我曾尝试将标记
放在正确的位置,但我没有为局部变量添加ct
。现在我看到它似乎很明显。谢谢