簡體   English   中英

C# Polly WaitandRetry 或延遲后再重試

[英]C# Polly WaitandRetry or delay and then retry

我創建了一個等待並重試的策略:我的步驟取決於 SELECT 查詢的 output。 有時數據庫需要很長時間,大約 35-45 秒才能在表中生成值。 所以,我必須等到那個時候檢查數據庫表中是否填充了值,或者不使用 Polly 重試。

以下是我的邏輯:

var parameters = new { PackageID = packageId };
var query = $"Select ID From Staging..Log Where StagePkg=@PackageID";

var _retryPolicy = Policy
    .Handle<Exception>()
    .WaitAndRetryAsync(5, retryAttempt => {
            var timeToWait = TimeSpan.FromSeconds(Math.Pow(10, retryAttempt));
            Console.WriteLine($"Waiting {timeToWait.TotalSeconds} seconds");
            return timeToWait;
        }
    );

return await _retryPolicy.ExecuteAsync<BatchMailLog>(async () => await SybaseConnection.WithConnectionAsync(c => c.QueryFirstOrDefaultAsync<StageLog>(query, parameters)));

它沒有像我想的那樣執行:執行查詢,檢查查詢是否返回值。 如果返回值為 0 或 null,則在 15 秒后重試查詢並重復,直到我們從 select 查詢中獲得值。

我收到以下錯誤:

System.NullReferenceException:Object 引用未設置為 object 的實例。

發生此錯誤是因為它沒有從查詢中獲取值,因此必須等待幾秒鍾然后重試。

如果返回值為 0 或 null 則在 15 秒后重試查詢並重復直到我們從 select 查詢中獲取值

這意味着您需要按以下方式設置策略:

  • 觸發器:如果返回值為 0 或 null
  • 休眠時長: 15秒后重試查詢
  • 時間:直到我們從 select 查詢中獲得值

使用 Polly,您可以通過以下方式描述這種所需的行為:

var retry = Policy
    .HandleResult<BatchMailLog>(b => (b?.XYZ ?? 0) == 0) //Trigger
    .WaitAndRetryForeverAsync( //Times
      _ => TimeSpan.FromSeconds(15)); //Sleep duration

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM