日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

.Net彈性和瞬態故障處理庫Polly實現執行策略_實用技巧

作者:天方 ? 更新時間: 2022-08-22 編程語言

執行策略

執行策略的常見方式是調用策略的Execute函數

var policy = Policy.Handle<TimeoutException>().Retry();
policy.Execute(DoSomething);

返回值:

如果有返回值,它也是可以獲取其返回值的:

var result = policy.Execute(DoSomething);

捕獲異常:

如果在策略的執行過程中出現了異常,也會在該函數中同步拋出來,和直接執行該委托行為一致。可以直接通過try-catch處理。

try
{
    policy.Execute(DoSomething);
}
catch (Exception e)
{
    throw;
}

也可以通過ExecuteAndCapture函數捕獲異常。

var result = policy.ExecuteAndCapture(DoSomething);
if (result.FaultType == null)
{
    Console.WriteLine(result.Result);
}

策略上下文

在策略的處理過程中,有一個上下文對象,可以在回調函數中使用:

public static RetryPolicy Retry(this PolicyBuilder policyBuilder, int retryCount, Action<Exception, int, Context> onRetry);

它是一個IDictionary<string,?object>類型的對象,它在Policy的執行過程中都可以使用,如:

Policy.Handle<TimeoutException>().Retry(3, (err, countDown, context) =>
{
    var method = context["method"];
    ConsoleLogger.WriteLine(method);
})

這個上下文對象可以在應用策略的時候帶入:

policy.Execute(DoSomething, new Context("context")
{
    ["method"] = "PolicyTest"
});

依賴注入

Polly也自帶了一個簡單的DI框架,方便復用Policy,使用方式如下:

var registry = new PolicyRegistry();
registry.Add("timeout & retry", Policy.Handle<TimeoutException>().Retry(3));

var policy = registry.Get<ISyncPolicy>("timeout & retry");
policy.Execute(DoSomething);

當然,也可以使用Autofac等自己喜歡的方式。

線程安全

Policy本身是線程安全的,可以并發使用同一個Policy,但如果Policy中執行的委托有多線程問題,仍然會出現異常。

異步的支持

Policy對異步操作也提供了良好的支持,只需要使用相應以Async結尾的函數即可。

var policy = Policy.Handle<TimeoutException>().RetryAsync(3);
await policy.ExecuteAsync(DoSomethingAsync);

PS:有的不需要(也沒有)以Async的函數,如Handle

同步上下文

對于有的異常處理,如果需要同步上下文,則需要在ExecuteAsync函數中設置continueOnCapturedContext參數為false。

var policy = Policy.Handle<TimeoutException>().RetryAsync(3);
await policy.ExecuteAsync(DoSomethingAsync, CancellationToken.None, continueOnCapturedContext: true);

Cancellation的支持

Polly也支持系統的co-operative cancellation框架,在重試,超時,bulkhead等策略中通知執行的委托,從而影響其行為。要使用Cancellation,需要在Excute的時候傳入CancellationToken。

policy.Execute(ct =>
{
    ct.ThrowIfCancellationRequested();
}, cts.Token);

具體示例在介紹彈性策略的超時策略時有介紹到。

原文鏈接:https://www.cnblogs.com/TianFang/p/8215736.html

欄目分類
最近更新