我們開始在我們的遺留 WinForms 專案中使用 Polly 庫,該專案仍然在 .NET 4.0 框架上運行(這是必需的)。
問題是我們必須使用 Polly 庫的 4.3 版,并且很難找到問題的解決方案,因為我們找到的所有檔案都是關于該庫的更新版本。
例如,我們不能將Context值從重試回呼傳遞給執行,因為它Context是只讀的,我們不能將引數傳遞給執行委托,因為它使用Action型別。
對于所有這些問題,我們已經找到了一個創造性的解決方案,但我們仍然無法找到在特定條件下停止執行的方法。
在 Polly 5 中,CancellationToken是為此目的引入的,但我想在以前的版本中也有強制重試停止的方法。
public RetryPolicy DevicePolicy => Policy
.Handle<Exception>()
.WaitAndRetry(
MaxRetries,
retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
(exception, timeSpan, retryCount, context) =>
{
//If i get the timeout exception i want to stop the execution
if (exception is TimeoutException)
{
//In Polly 5.0 I can set the cancellationToken but with 4.3 there isn't
var cts = context["CancellationTokenSource"] as CancellationTokenSource;
cts.Cancel();
}
else
{
var errHeader = $"device connection error. Attempt {retryCount} of {MaxRetries}";
Log.Warn(errHeader, exception);
}
});
任何的想法?
uj5u.com熱心網友回復:
我認為您試圖從錯誤的角度解決問題。
與其嘗試取消重試,不如盡量避免觸發重試。
我在 dotnetfiddle 中創建了一個示例應用程式,以確保我提出的解決方案也適用于 Polly 4.3 版
public static void Main()
{
var retry = Policy
.Handle<Exception>(ex => !(ex is TimeoutException))
.WaitAndRetry(2, _ => TimeSpan.FromSeconds(1));
retry.Execute(WrappedMethod);
}
public static int counter = 0;
public static void WrappedMethod()
{
Console.WriteLine("The wrapped method is called");
if(counter == 1)
throw new TimeoutException();
throw new ArgumentException();
}
該Handle<TException>方法具有接受委托 ( )的多載Func<Exception, bool>。換句話說,您可以定義一個謂詞,您可以在其中定義哪些例外應該觸發重試。
根據我的理解,除了TimeoutException拋出a 之外,您希望在每種情況下都進行重試。您可以像這樣輕松地指定它:
.Handle<Exception>(ex => !(ex is TimeoutException))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/369370.html
