在 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
}
目标:
如果您尝试了第三次,但没有成功。那你想用别的方法。
我想阻止显示错误消息网页。
问题:
是否可以在 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
}