Я использую Polly, чтобы повторить вызовы веб-службы в случае сбоя вызова с помощью WebException, потому что я хочу убедиться, что метод выполняется правильно, прежде чем продолжить. Однако иногда веб-методы по-прежнему вызывают исключение даже после нескольких повторных попыток, и я не хочу повторять попытку навсегда. Могу ли я использовать Polly для отображения диалогового окна подтверждения, например «Достигнуто максимальное количество попыток! Убедитесь, что соединение включено, и нажмите« Повторить ». Затем счетчик повторных попыток должен сбросить до начального значения и начать заново. Могу ли я добиться этого, используя только Полли, или мне нужно написать свою собственную логику? Идеи?
Полли показать диалоговое окно после того, как достигнуто количество повторных попыток
Ответы (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.
- If you want a way for the user to exit the
- 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