【问题标题】:Using Polly for a retry attempt from an async function使用 Polly 从异步函数重试
【发布时间】:2019-12-23 13:29:18
【问题描述】:

我正在尝试重试失败的操作 3 次。

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

我想在重试操作失败的情况下获得异常,然后重试2次等等。

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

函数应该返回

Task<IReadOnlyCollection<string>>

我收到以下错误:

转换为任务返回委托的异步 lambda 表达式不能 返回一个值

【问题讨论】:

    标签: c# async-await polly


    【解决方案1】:

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

    类似这样的:

    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");
    }
    

    输出

    try: 1, Exception: boom
    try: 2, Exception: boom
    try: 3, Exception: boom
    foo
    

    【讨论】:

    • 我想你很清楚我的问题。只是为了确保我明白了。如果抛出异常,DoSomething 会再次运行,如果没有,它会返回结果但不会再次运行?
    • 正确,result 将包含您的方法返回的任何内容。如果失败太多次,它就会像正常抛出异常一样。
    • 我不确定我是否理解问题 #1 - 如果需要,这种形式的重试策略最多会尝试 3 次。如果没有抛出它处理的异常,它根本不会重试。 #2 - 您不需要将异常传递给DoSomething,因为这是异常的来源。你可以使用普通的try/catch
    • 在重试委托中,您可以设置或调用设置可由(在此示例中)DoSomething 访问的变量的东西。你可以根据它编写逻辑。
    • 重试策略重载,其中onRetry 委托被传递Polly.Context。还有ExecuteAsync(...) 的重载,其中执行的委托可以作为输入参数传递Polly.Context。因此,您可以通过将数据存储在Polly.Context 上的字典中来共享数据。见github.com/App-vNext/Polly/wiki/…thepollyproject.org/2017/05/04/putting-the-context-into-polly 。通过Polly.Context 共享数据避免共享局部变量;如果 policy defn 与 use 处于不同的范围内,则很有用。
    猜你喜欢
    • 1970-01-01
    • 2022-07-14
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多