Политика C # Polly WaitAndRetry для повтора функции

Я новичок в программировании на C # и просто хочу знать, как настроить Polly WaitAndRetry для моей функции в случае сбоя. Следующие мои шаги

  1. Я установил пакет Install-Package Polly, используя пакет NuGet

  2. добавил using polly в мой код.

  3. Ниже мой код

    try {
        SendToDatabase(model));
    
    await Policy.Handle<Exception>().RetryAsync(NUMBER_OF_RETRIES).ExecuteAsync(async()=>await SendToDatabase(model)).ConfigureAwait(false);
         } 
    Catch(Exception e) {
        _log.write("error occurred");
        }
    
    public async Task<strig> SendToDataBase(config model) {
        var ss = DataBase.PostCallAsync(model).GetAwaiter().GetResult();
        return ss;
    }
    
    

Но этот звонок звонит постоянно, без промедления. Я попытался использовать WaitAndRetryAsync в вызове catch, но он не работает. WaitAndRetryAsync принимает только сообщение HTTP repose. Я хочу реализовать опцию ait и retry в try-catch


person june alex    schedule 27.08.2020    source источник
comment
Я не очень хорошо знаком с Полли, но дело не в том, что вы не можете беспокоиться обо всей попытке улова, как у вас здесь, вы просто конфигурируете Полли (может быть, как у вас, а может и нет), а затем называете это, Полли обрабатывает сбои и reties, и если он сработает с первого раза, то отлично вернет результат   -  person Dave    schedule 27.08.2020
comment
хорошо, спасибо. я удалю попробуй поймать   -  person june alex    schedule 27.08.2020
comment
@junealex Постарайтесь не использовать GetAwaiter().GetResult(). Пожалуйста, отдайте предпочтение await.   -  person Peter Csala    schedule 27.08.2020
comment
ок. спасибо Peter Csala   -  person june alex    schedule 27.08.2020


Ответы (1)


Вы говорите, что хотите WaitAndRetry, но не используете эту функцию ... И она работает не только с HttpResponse. Прочтите документацию.

Приведенный ниже код должен дать вам фору:

class Program
{
    static async Task Main(string[] args)
    {
        // define the policy using WaitAndRetry (try 3 times, waiting an increasing numer of seconds if exception is thrown)
        var policy = Policy
          .Handle<Exception>()
          .WaitAndRetryAsync(new[]
          {
            TimeSpan.FromSeconds(1),
            TimeSpan.FromSeconds(2),
            TimeSpan.FromSeconds(3)
          });

        // execute the policy
        await policy.ExecuteAsync(async () => await SendToDatabase());

    }

    static async Task SendToDatabase()
    {
        Console.WriteLine("trying to send to database");
        await Task.Delay(100);
        throw new Exception("it failed!");
    }
}
person jeroenh    schedule 27.08.2020
comment
не требуется ли попытка поймать?. Также как сохранить возвращаемое значение в ExecuteAsync? var info = await policy.ExecuteAsync (async () = ›await SendToDatabase ()); сюда правильно? - person june alex; 27.08.2020
comment
Политика обрабатывает только исключения, выдаваемые делегатом выполнения во время повторной попытки. Если последняя попытка повторения завершится неудачно, будет сгенерировано исключение, поэтому вы все равно можете захотеть поймать попытку около ExecuteAsync для обработки этого сценария. См. Объяснение в документации. - person rob.earwaker; 31.08.2020