Полли показать диалоговое окно после того, как достигнуто количество повторных попыток

Я использую Polly, чтобы повторить вызовы веб-службы в случае сбоя вызова с помощью WebException, потому что я хочу убедиться, что метод выполняется правильно, прежде чем продолжить. Однако иногда веб-методы по-прежнему вызывают исключение даже после нескольких повторных попыток, и я не хочу повторять попытку навсегда. Могу ли я использовать Polly для отображения диалогового окна подтверждения, например «Достигнуто максимальное количество попыток! Убедитесь, что соединение включено, и нажмите« Повторить ». Затем счетчик повторных попыток должен сбросить до начального значения и начать заново. Могу ли я добиться этого, используя только Полли, или мне нужно написать свою собственную логику? Идеи?


person bigb055    schedule 22.08.2018    source источник


Ответы (1)


У Polly нет ничего встроенного для управления диалоговыми окнами, поскольку он полностью не зависит от контекста, в котором используется. Однако вы можете настроить дополнительное поведение при повторных попытках с помощью делегата onRetry, чтобы вы могли подключить к нему диалоговое окно. Общий:

  • Use an outer RetryForever policy, and display the dialog box in the onRetry action configured on that policy.
    • If you want a way for the user to exit the RetryForever, a cancel action in the dialog could throw some other exception (which you trap with a try-catch round all the policies), to cause an exit.
  • Within the outer policy, use an inner Retry policy for however many tries you want to make without intervention.
    • Because this is a different policy instance from the retryforever, and has fixed retry count, the retry count will automatically start afresh each time it is executed.
  • Используйте PolicyWrap, чтобы объединить две политики повтора вместе.

В псевдокоде:

var retryUntilSucceedsOrUserCancels = Policy
    .Handle<WhateverException>()
    .RetryForever(onRetry: { /* show my dialog box*/ });
var retryNTimesWithoutUserIntervention = Policy
    .Handle<WhateverException>()
    .Retry(n); // or whatever more sophisticated retry style you want
var combined = retryUntilSucceedsOrUserCancels
    .Wrap(retryNTimesWithoutUserIntervention);

combined.Execute( /* my work */ );

Конечно, использование внешней RetryForever() политики - всего лишь вариант: вы также можете создать эквивалент вручную.

person mountain traveller    schedule 22.08.2018