为了账号安全,请及时绑定邮箱和手机立即绑定

具有功能的 Polly 重试策略不等待结果

具有功能的 Polly 重试策略不等待结果

C#
MMTTMM 2021-08-07 17:07:13
我正在尝试将我现有的函数转换为 Polly Retry 策略public static T Execute<T>(Func<T> getTask) where T : Task{    var retryCount = 3;    while (retryCount-- > 0)    {        try        {            getTask().Wait();            return getTask();        } catch(Exception ex){            // handle retry        }    }}转换成这个public static T Execute<T>(Func<T> func) where T : Task{    var task = func();    Policy.Handle<HttpRequestException>()        .Or<TimeoutException>()        .WaitAndRetryAsync(            3,            retryAttempt => TimeSpan.FromSeconds(Math.Pow(5, retryAttempt)),            (exception, timeSpan, retryCount, context) =>            {                //do some logging            })        .ExecuteAsync(func).Wait();    return task;}和测试代码是var retryCount = 0;var res = HttpRetryWrapper.Execute(() => Task.Factory.StartNew<string>(function: () =>{    if (++retryCount == 3)    {        return "fake";    }    throw new TimeoutException();}));当我断言res价值时,我没有得到正确的结果。调试将我追踪到Execution没有正确等待结果的地方。调用的次数test function是正确的。但是日志记录混乱,最终结果没有结果fake
查看完整描述

2 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

我想你想要的是


public static T Execute<T>(Func<T> func) where T : Task

{

    return Policy.Handle<HttpRequestException>()

        .Or<TimeoutException>()

        .WaitAndRetryAsync(

            3,

            retryAttempt => TimeSpan.FromSeconds(Math.Pow(5, retryAttempt)),

            (exception, timeSpan, retryCount, context) =>

            {

                //do some logging

            })

        .ExecuteAsync(func).Wait();

}

在您的代码示例中,您调用func一次并返回它,然后在定义和调用策略之间,但不返回调用该策略的结果。


如果你想避免,Wait我想你也可以这样做


public static T Execute<T>(Func<T> func) where T : Task

{

    return Policy.Handle<HttpRequestException>()

        .Or<TimeoutException>()

        .WaitAndRetryAsync(

            3,

            retryAttempt => TimeSpan.FromSeconds(Math.Pow(5, retryAttempt)),

            (exception, timeSpan, retryCount, context) =>

            {

                //do some logging

            })

        .ExecuteAsync(async () => await func());

}


查看完整回答
反对 回复 2021-08-07
  • 2 回答
  • 0 关注
  • 202 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信