重试计数达到后显示Polly显示对话框

时间:2018-08-22 19:24:57

标签: xamarin.android system.net.webexception polly retry-logic

我正在使用Polly重试Web服务调用,以防WebException调用失败,因为我想确保在继续操作之前方法正确执行。但是有时,即使重试了几次后,Web方法仍然会引发异常,我不想永远重试。我可以使用Polly显示一些确认对话框吗,例如“达到最大重试次数!确保已启用连接,然后按重试。”然后重试计数器应重置为初始值,然后重新开始。我可以仅使用Polly来实现这一目标,还是应该编写自己的逻辑?想法?

1 个答案:

答案 0 :(得分:1)

Polly没有内置用于管理对话框的内容,因为它完全与使用它的上下文无关。但是,您可以使用onRetry委托自定义重试时的额外行为,以便在其中挂接一个对话框。总体:

  • 使用外部RetryForever policy,并在该策略上配置的onRetry操作中显示对话框。
    • 如果您想要让用户退出RetryForever的方法,则对话框中的取消动作可能会引发其他异常(您可以通过尝试捕获所有策略来捕获该异常),从而导致退出。
  • 在外部策略中,使用内部Retry policy可以进行许多尝试而无需干预。
    • 由于这是与retryforever不同的策略实例,并且具有固定的重试次数,因此每次执行时,重试次数都会自动重新开始。
  • 使用PolicyWrapwrap the two retry policies together

使用伪代码:

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()策略只是一种选择:您也可以手动构建等效策略。