Polly异步重试下Console.WriteLine未生效 需3次重试后输出报错提示
代码无法达成目标的核心缺陷
- Polly策略的异常捕获范围不匹配实际异常类型
当前策略仅声明捕获HttpRequestException、TaskCanceledException两类异常,但PersistApplicationData2中整数除以0的逻辑会抛出DivideByZeroException,完全不在策略的捕获列表内。首次执行失败后策略不会触发任何重试,直接向外抛出异常,从逻辑上就不可能完成3次执行尝试的要求。 - 异步执行链没有等待导致进程提前终止
Main方法作为程序同步入口,代码中ExecuteAsync、ContinueWith返回的Task对象没有做任何阻塞等待,Main方法走完所有同步逻辑后会直接退出进程,既等不到重试流程跑完,也等不到后续的"show error"输出逻辑执行。 - 重试次数参数的语义和目标要求不一致
Polly的WaitAndRetryAsync第一个入参的含义是「初始尝试失败后的重试次数」,传入值3的话总执行次数是1次初始尝试 + 3次重试 = 4次,和目标要求的“累计3次执行尝试”不匹配。如果要实现总共3次尝试,需要给该参数传入2。 - 异常判断逻辑存在疏漏
代码中用ContinueWith判断异常时,没有指定TaskContinuationOptions.OnlyOnFaulted,且异步任务抛出的异常会被包装在AggregateException中,在进程提前退出的场景下,这类未被观察的异常很可能直接导致程序崩溃,而不是正常输出提示信息。
修正后的核心逻辑参考:
static void Main(string[] args) { var maxTotalAttempts = 3; var pauseBetweenFailures = TimeSpan.FromSeconds(2); var retryPolicy = Policy .Handle<HttpRequestException>() .Or<TaskCanceledException>() .Or<DivideByZeroException>() // 补充实际抛出的异常类型 // 总尝试3次=重试2次 .WaitAndRetryAsync(maxTotalAttempts - 1, i => pauseBetweenFailures); try { // 同步阻塞等待异步流程执行完成 retryPolicy.ExecuteAsync(PersistApplicationData2).GetAwaiter().GetResult(); } catch (Exception) { Console.WriteLine("show error"); } }
内容的提问来源于stack exchange,提问作者HelloWorld1
相关产品推荐
相关产品推荐

