我是Polly的新手,所以可能会有一种完全不同的方法,这就是我要尝试做的事情,这完全可以。
我的目标是:
token
可能由于超时或请求而被取消token
被取消。尽管我使用的方法可行,但似乎缺少了一些东西,可能有更好/更干净的方法来完成我想要的事情。我特别在考虑这一行.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;
}
}
答案 0 :(得分:1)
Execute
的重载需要CancellationToken
:
.Execute((ct) =>
{
ct.ThrowIfCancellationRequested();
action.Invoke();
}, token);
此令牌还将应用于WaitAndRetryForever
内处理的延迟。