Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Polly进行取消令牌重试?_C#_Polly - Fatal编程技术网

C# 如何使用Polly进行取消令牌重试?

C# 如何使用Polly进行取消令牌重试?,c#,polly,C#,Polly,我是波利的新手,所以可能会有一种与我尝试的完全不同的方法,这是完全可以接受的 我的目标是: 令牌可能因超时或请求而取消 永远重试,直到取消成功或标记 请求取消时,应立即退出等待 虽然我所使用的方法似乎有些遗漏,但可能有更好/更干净的方法来实现我的目标。我特别想到这一行(retrytry=>TimeSpan.Zero,。我觉得我应该能够在这里传递retryDelay,而不是TimeSpan.Zero但是如果我在请求取消时这样做,它不会返回,直到retryDelay完成等待,而不是像我希望的那样立即

我是波利的新手,所以可能会有一种与我尝试的完全不同的方法,这是完全可以接受的

我的目标是:

  • 令牌
    可能因超时或请求而取消
  • 永远重试,直到取消成功或
    标记
  • 请求取消时,应立即退出等待
  • 虽然我所使用的方法似乎有些遗漏,但可能有更好/更干净的方法来实现我的目标。我特别想到这一行(retrytry=>TimeSpan.Zero,
    。我觉得我应该能够在这里传递
    retryDelay
    ,而不是
    TimeSpan.Zero
    但是如果我在请求取消时这样做,它不会返回,直到
    retryDelay
    完成等待,而不是像我希望的那样立即返回

    我确实看到了.Execute看起来可以用取消令牌做些什么,但我不知道如何使用它,所以如果这是我的答案,请忽略我的其他胡言乱语

    以防万一,Polly NuGet的一位开发人员看到了这一点,我希望看到的是,
    WaitAndRetryForever
    的重载,它将取消令牌作为参数,以便在取消时可以立即返回。我犹豫是否将其作为官方建议,因为我对Polly来说太陌生了,我不确定这是否有意义

    这是我目前使用的方法:

    internal static void Retry(Action action, TimeSpan retryDelay, CancellationToken token)
    {
        try
        {
            Policy
                .Handle<IOException>()
                .WaitAndRetryForever(retryAttempt => TimeSpan.Zero,
                    (ex, delay, context) =>
                    {
                        Task.Delay(retryDelay, token).GetAwaiter().GetResult();
                        token.ThrowIfCancellationRequested();
                        //Log exception here
                    })
                .Execute(() =>
                {
                    token.ThrowIfCancellationRequested();
                    action.Invoke();
                });
        }
        catch (OperationCanceledException)
        {
            //Log cancellation here
            throw;
        }
        catch (Exception ex)
        {
            //Log exception here
            throw;
        }
    }
    
    内部静态无效重试(操作操作、TimeSpan retryDelay、CancellationToken令牌)
    {
    尝试
    {
    政策
    .Handle()
    .WaitAndRetryForever(retrytry=>TimeSpan.Zero,
    (例如,延迟、上下文)=>
    {
    Task.Delay(retryDelay,token).GetAwaiter().GetResult();
    token.ThrowIfCancellationRequested();
    //此处记录异常
    })
    .Execute(()=>
    {
    token.ThrowIfCancellationRequested();
    action.Invoke();
    });
    }
    捕获(操作取消异常)
    {
    //在这里取消日志
    投掷;
    }
    捕获(例外情况除外)
    {
    //此处记录异常
    投掷;
    }
    }
    
    超负荷的
    Execute
    会使用
    取消令牌

    .Execute((ct) =>
    {
        ct.ThrowIfCancellationRequested();
        action.Invoke();
    }, token);
    
    此令牌还将应用于
    WaitAndRetryForever
    内处理的延迟


    我不知道如何读取IntelliSense。我曾尝试将
    标记
    放在正确的位置,但我没有为局部变量添加
    ct
    。现在我看到它似乎很明显。谢谢