在 WaitAndRetryAsync 中输入一个 Catch 方法

Enter a Catch Method in WaitAndRetryAsync

目标:
如果您尝试了第三次,但没有成功。那你想用别的方法。
我想阻止显示错误消息网页。

问题:
是否可以在 WaitAndRetryAsync 中输入类似于 catch 方法的方法?

RetryPolicy<HttpResponseMesssage> httpWaitAndRetryPolicy = Policy
    .HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
    .WaitAndRetryAsync
        (3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2. retryAttempt)/2));

谢谢!

您可以在您的政策中使用 ExecuteAsync,然后使用 ContinueWith 处理最终响应,如下所示:

 RetryPolicy<HttpResponseMessage>
 .Handle<HttpRequestException>()
 .Or<TaskCanceledException>()
 .WaitAndRetryAsync
     (3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt) / 2))
 .ExecuteAsync(() =>
 {
     //do stuff that you want retry

 }).ContinueWith(x =>
 {
     if (x.Exception != null)
     {
         //means exception raised during execute and handle it
     }

     // return your HttpResponseMessage
 }, scheduler: TaskScheduler.Default);

根据@TheodorZoulias 的评论,使用 ContinueWith 的最佳做法是显式设置 TaskScheduler 为 defualt,因为 ContinueWith 将调度程序更改为 Current 并且可能导致死锁。

首先 WaitAndRetryAsync returns 是 AsyncRetryPolicy<T>,而不是 RetryPolicy<T>,这意味着您发布的代码无法编译。

在 polly 的情况下,策略的定义和该策略的执行是分开的。因此,首先您定义一个策略(或策略的混合),然后在需要时执行它。

定义

AsyncRetryPolicy<HttpResponseMessage> retryInCaseOfNotSuccessResponsePolicy = Policy
    .HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
    .WaitAndRetryAsync
        (3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2.retryAttempt) / 2));

执行

HttpResponseMessage serviceResponse = null;
try
{
    serviceResponse = await retryInCaseOfNotSuccessResponsePolicy.ExecuteAsync(
        async ct => await httpClient.GetAsync(resourceUri, ct), default);
}
catch (Exception ex)
    when(ex is HttpRequestException || ex is OperationCanceledException)
{
    //TODO: log
}

if (serviceResponse == null)
{
    //TODO: log
}