使用 Polly 从异步函数进行重试

Avi*_*Avi 3 c# async-await polly

我试图重试失败的操作 3 次。

我正在使用 Polly 进行重试操作。

我想在重试操作失败的情况下获得异常并重试 2 次,依此类推。

return await Policy
           .Handle<CustomException>()
           .RetryAsync(3, onRetryAsync: async (exception, retryCount, context) =>
           {
               return await runner.run(params);
           });
Run Code Online (Sandbox Code Playgroud)

函数应该返回

Task<IReadOnlyCollection<string>>
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

转换为任务返回委托的异步 lambda 表达式无法返回值

Cro*_*der 8

我认为在重试策略中运行您的逻辑是不寻常的 - 除非我误解了您的问题。更常见的是,您通过调用运行逻辑的方法来执行策略。

像这样的东西:

async Task Main()
{
    var polly = Policy
           .Handle<Exception>()        
           .RetryAsync(3, (exception, retryCount, context) => Console.WriteLine($"try: {retryCount}, Exception: {exception.Message}"));

    var result = await polly.ExecuteAsync(async () => await DoSomething());
    Console.WriteLine(result);
}

int count = 0;

public async Task<string> DoSomething()
{
    if (count < 3)
    {
        count++;
        throw new Exception("boom");
    }

    return await Task.FromResult("foo");
}
Run Code Online (Sandbox Code Playgroud)

输出

try: 1, Exception: boom
try: 2, Exception: boom
try: 3, Exception: boom
foo
Run Code Online (Sandbox Code Playgroud)

  • 正确的,“结果”将包含您的方法返回的任何内容。如果失败次数太多,它就会表现得像正常抛出异常一样。 (2认同)