Первая попытка занимает 14 секунд, хотя я указал время повторения 2 секунды.Первая попытка завершается неудачно после 14 с, затем разрыв до 2 с до второй попытки.
Это правильно.WaitAndRetry определяет длительность ожидания после сбоя перед повторной попыткой, как указано в документации .
То, что я хочу, чтобы каждые 2 с и время ожидания и повторение при любой ошибке,
Чтобы установить тайм-аут, используйте политику 1011 * Timeout Полли .Чтобы наложить тайм-аут и повторить попытку, объедините политики Timeout и Retry , используя PolicyWrap .Таким образом, вы можете адаптировать свой код следующим образом:
var timeoutPolicy = Policy.TimeoutAsync(TimeSpan.FromMilliseconds(2000));
var retryPolicy = Policy
.Handle<Exception>() // retry on any
.WaitAndRetryAsync(6, // or just RetryAsync() if you don't want any wait before retrying
retryAttempt => /* a timespan, _if you want a wait before retrying */,
(response, calculatedWaitDuration, ctx) =>
{
Log.LogError($"Failed attempt {attempt++}. Waited for {calculatedWaitDuration}. Exception: {response?.ToString()}");
});
var combinedPolicy = retryPolicy.WrapAsync(timeoutPolicy);
HttpResponseMessage httpResp = null;
await combinedPolicy.ExecuteAsync(async () =>
{
httpResp = await DoPost();
httpResp?.EnsureSuccessStatusCode(); // throws HttpRequestException
return httpResp;
});
Для получения дополнительной информации и примеров см. этот похожий вопрос stackoverflow .