Диалоговое окно 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() Политика - это просто вариант: вы также можете создать эквивалент вручную.

Другие вопросы по тегам