Диалоговое окно Polly Show после достижения количества повторов
Я использую Polly, чтобы повторить вызовы веб-службы в случае сбоя вызова с WebException, потому что я хочу убедиться, что метод выполняется правильно, прежде чем продолжить. Однако иногда веб-методы по-прежнему выдают исключение даже после нескольких повторных попыток, и я не хочу повторять попытки навсегда. Могу ли я использовать Polly, чтобы показать диалоговое окно подтверждения, например, "Максимальное количество повторов достигнуто! Убедитесь, что соединение включено и нажмите" Повторить "" Затем счетчик повторов должен сброситься до начального значения и начать снова. Могу ли я добиться этого, используя только Полли, или я должен написать свою собственную логику? Идеи?
1 ответ
У Полли нет ничего встроенного для управления диалоговыми окнами, так как он совершенно не зависит от контекста, в котором он используется. Однако вы можете настроить дополнительное поведение при повторных попытках с onRetry
делегировать, так что вы можете подключить там диалоговое окно. В общем и целом:
- Используйте внешнюю политику RetryForever и откройте диалоговое окно в
onRetry
действие, настроенное на этой политике.- Если вы хотите, чтобы пользователь мог выйти из
RetryForever
действие отмены в диалоговом окне может вызвать какое-то другое исключение (которое вы перехватываете, пытаясь поймать все политики), чтобы вызвать выход.
- Если вы хотите, чтобы пользователь мог выйти из
- Во внешней политике используйте внутреннюю политику Retry для любого количества попыток, которые вы хотите сделать без вмешательства.
- Поскольку это экземпляр политики, отличный от retryforever, с фиксированным счетом повторных попыток, счет повторных попыток будет автоматически начинаться заново при каждом его выполнении.
- Используйте 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()
Политика - это просто вариант: вы также можете создать эквивалент вручную.