我正在尝试使用Polly来处理我的WebRequest
抛出的异常。
这是我的实施。
var generalExceptionPolicy=Policy.Handle<Exception>().WaitAndRetry(2, retryAttempt =>
TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),(exception,timespan)=>{
if(attempt++ == 2)
{
Toast.MakeText(Activity,"No Connection Bro",ToastLength.Short).Show();
}
});
var test = await generalExceptionPolicy.ExecuteAsync(()=>PostPreLogin (view.FindViewById<EditText> (Resource.Id.mobileTextBox).Text));
我有重试工作。但我想知道的是,在最后一次尝试后我将在哪里收到回调?我在策略定义部分得到一个回调,我试图显示一个Toast
message。但这只是在试验之间。我上次审判后没有得到它。
此外,我的UI在最后一次试用后冻结。也许因为ExecuteAsync
,因为Task
Exception
没有完成。如果是这样,使用Polly库的正确方法是什么?
这是我试图用Polly处理的方法
public async Task<string> PostPreLogin(string userName)
{
var preloginvalue = await Account.PreLoginPost (userName);
return preloginvalue;
}
我认为你所追求的是ExecuteAndCapture
而不是Execute
:
generalExceptionPolicy.ExecuteAndCapture(() => DoSomething());
Check this out了解更多详情。
这很容易,基本上你需要定义策略并在以后传递回调就是这么简单。检查this article which describes如何准确地完成您想要的细节。
基本上,您可以按如下方式定义策略:
async Task<HttpResponseMessage> QueryCurrencyServiceWithRetryPolicy(Func<Task<HttpResponseMessage>> action)
{
int numberOfTimesToRetry = 7;
int retryMultiple = 2;
//Handle HttpRequestException when it occures
var response = await Policy.Handle<HttpRequestException>(ex =>
{
Debug.WriteLine("Request failed due to connectivity issues.");
return true;
})
//wait for a given number of seconds which increases after each retry
.WaitAndRetryAsync(numberOfTimesToRetry, retryCount => TimeSpan.FromSeconds(retryCount * retryMultiple))
//After the retry, Execute the appropriate set of instructions
.ExecuteAsync(async () => await action());
//Return the response message gotten from the http client call.
return response;
}
您可以按如下方式传递回调:
var response = await QueryCurrencyServiceWithRetryPolicy(() => _httpClient.GetAsync(ALL_CURRENCIES_URL));