我正在尝试将我的现有函数转换为Polly重试策略
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
。
Wait
。尝试将函数设置为异步并在内部等待。 - JamesFaixtask
局部变量,但它并没有被你的策略使用。Polly 会自行调用该函数。 - JamesFaixpublic static T Execute<T>(Func<T> func) where T : Task
- RaceBase