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);
var timeoutPolicy = Policy.Timeout(1, TimeoutStrategy.Pessimistic);
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)
{
var timeoutPolicy = Policy.Timeout(1, TimeoutStrategy.Pessimistic);
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();
});
}
}