[英]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 查詢中獲取值
這意味着您需要按以下方式設置策略:
使用 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.