使用Polly C#Library处理异常的正确方法

问题描述 投票:2回答:2

我正在尝试使用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));

我有重试工作。但我想知道的是,在最后一次尝试后我将在哪里收到回调?我在策略定义部分得到一个回调,我试图显示一个Toastmessage。但这只是在试验之间。我上次审判后没有得到它。

此外,我的UI在最后一次试用后冻结。也许因为ExecuteAsync,因为Task Exception没有完成。如果是这样,使用Polly库的正确方法是什么?

这是我试图用Polly处理的方法

public  async Task<string> PostPreLogin(string userName)
    {
        var preloginvalue = await Account.PreLoginPost (userName);
        return preloginvalue;

    }
c# .net exception xamarin xamarin.android
2个回答
2
投票

我认为你所追求的是ExecuteAndCapture而不是Execute

generalExceptionPolicy.ExecuteAndCapture(() => DoSomething());

Check this out了解更多详情。


1
投票

这很容易,基本上你需要定义策略并在以后传递回调就是这么简单。检查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));
© www.soinside.com 2019 - 2024. All rights reserved.