PolicyWrapEngine
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
namespace Polly.Timeout
{
public class TimeoutPolicy : Policy, ITimeoutPolicy, IsPolicy
{
private Func<Context, TimeSpan> _timeoutProvider;
private TimeoutStrategy _timeoutStrategy;
private Action<Context, TimeSpan, Task, Exception> _onTimeout;
internal TimeoutPolicy(Func<Context, TimeSpan> timeoutProvider, TimeoutStrategy timeoutStrategy, Action<Context, TimeSpan, Task, Exception> onTimeout)
: base((PolicyBuilder)null)
{
if (timeoutProvider == null)
throw new ArgumentNullException("timeoutProvider");
_timeoutProvider = timeoutProvider;
_timeoutStrategy = timeoutStrategy;
if (onTimeout == null)
throw new ArgumentNullException("onTimeout");
_onTimeout = onTimeout;
}
[DebuggerStepThrough]
protected override TResult Implementation<TResult>(Func<Context, CancellationToken, TResult> action, Context context, CancellationToken cancellationToken)
{
return TimeoutEngine.Implementation(action, context, cancellationToken, _timeoutProvider, _timeoutStrategy, _onTimeout);
}
}
}
namespace Polly.Wrap
{
internal static class PolicyWrapEngine
{
internal static TResult Implementation<TResult>(Func<Context, CancellationToken, TResult> func, Context context, CancellationToken cancellationToken, ISyncPolicy<TResult> outerPolicy, ISyncPolicy<TResult> innerPolicy)
{
return outerPolicy.Execute((Func<Context, CancellationToken, TResult>)((Context ctx, CancellationToken ct) => innerPolicy.Execute(func, ctx, ct)), context, cancellationToken);
}
internal static TResult Implementation<TResult>(Func<Context, CancellationToken, TResult> func, Context context, CancellationToken cancellationToken, ISyncPolicy<TResult> outerPolicy, ISyncPolicy innerPolicy)
{
return outerPolicy.Execute((Func<Context, CancellationToken, TResult>)((Context ctx, CancellationToken ct) => innerPolicy.Execute<TResult>(func, ctx, ct)), context, cancellationToken);
}
internal static TResult Implementation<TResult>(Func<Context, CancellationToken, TResult> func, Context context, CancellationToken cancellationToken, ISyncPolicy outerPolicy, ISyncPolicy<TResult> innerPolicy)
{
return outerPolicy.Execute((Context ctx, CancellationToken ct) => innerPolicy.Execute(func, ctx, ct), context, cancellationToken);
}
internal static TResult Implementation<TResult>(Func<Context, CancellationToken, TResult> func, Context context, CancellationToken cancellationToken, ISyncPolicy outerPolicy, ISyncPolicy innerPolicy)
{
return outerPolicy.Execute((Context ctx, CancellationToken ct) => innerPolicy.Execute<TResult>(func, ctx, ct), context, cancellationToken);
}
internal static void Implementation(Action<Context, CancellationToken> action, Context context, CancellationToken cancellationToken, ISyncPolicy outerPolicy, ISyncPolicy innerPolicy)
{
outerPolicy.Execute(delegate(Context ctx, CancellationToken ct) {
innerPolicy.Execute(action, ctx, ct);
}, context, cancellationToken);
}
}
}