using Polly;
using Polly.Timeout;
using System;
public class PolicyHelper
{
public static T Execute<T>(Func<T> ExecuteAction, Func<T> FallbackExecuteAction, Action<DelegateResult<T>, Context> onFallback = null, Action<Exception, int> onRetry=null)
{
T t = default(T);
// 超时策略,执行目标委托超过 1 秒则视为超时,抛出异常。
var timeoutPolicy = Policy.Timeout(1, TimeoutStrategy.Pessimistic);
// 重试策略,重试 1次,每次打印信息。
var retryPolicy = Policy.Handle<Exception>().Retry(1, (exception, i) =>
{
Console.WriteLine($"开始第 {i} 次重试...");
if (onRetry == null) return;
onRetry.Invoke(exception, i);
});
//降级执行
Policy<T> policy = Policy<T>.Handle<Exception>().Fallback(
FallbackExecuteAction()
, (exp, context) =>
{
if (onFallback == null) return;
onFallback(exp, context);
});
policy = policy.Wrap(retryPolicy);
policy = policy.Wrap(timeoutPolicy);
//执行方法
t = policy.Execute(ExecuteAction);
return t;
}
public static void Execute(Action ExecuteAction, Action FallbackExecuteAction=null, Action<Exception> onFallback = null, Action<Exception, int> onRetry = null)
{
// 超时策略,执行目标委托超过 1 秒则视为超时,抛出异常。
var timeoutPolicy = Policy.Timeout(1, TimeoutStrategy.Pessimistic);
// 重试策略,重试 1次,每次打印信息。
var retryPolicy = Policy.Handle<Exception>().Retry(1, (exception, i) =>
{
Console.WriteLine($"开始第 {i} 次重试...");
if (onRetry == null) return;
onRetry.Invoke(exception, i);
});
//降级执行
Policy policy = Policy.Handle<Exception>().Fallback( FallbackExecuteAction
, exp =>
{
if (onFallback == null) return;
onFallback(exp);
});
policy = policy.Wrap(retryPolicy);
policy = policy.Wrap(timeoutPolicy);
//执行方法
policy.Execute(() =>
{
ExecuteAction.Invoke();
});
}
}
超时重试降级重试封装的方法
于 2021-11-12 16:06:58 首次发布
本文介绍如何使用Polly库在C#中创建自定义策略,包括超时处理、重试机制和降级执行,以便优雅地处理异步操作中的异常和性能问题。
161

被折叠的 条评论
为什么被折叠?



