.Net彈性和瞬態(tài)故障處理庫Polly實現(xiàn)執(zhí)行策略
執(zhí)行策略
執(zhí)行策略的常見方式是調(diào)用策略的Execute函數(shù)
var policy = Policy.Handle<TimeoutException>().Retry(); policy.Execute(DoSomething);
返回值:
如果有返回值,它也是可以獲取其返回值的:
var result = policy.Execute(DoSomething);
捕獲異常:
如果在策略的執(zhí)行過程中出現(xiàn)了異常,也會在該函數(shù)中同步拋出來,和直接執(zhí)行該委托行為一致??梢灾苯油ㄟ^try-catch處理。
try
{
policy.Execute(DoSomething);
}
catch (Exception e)
{
throw;
}也可以通過ExecuteAndCapture函數(shù)捕獲異常。
var result = policy.ExecuteAndCapture(DoSomething);
if (result.FaultType == null)
{
Console.WriteLine(result.Result);
}策略上下文
在策略的處理過程中,有一個上下文對象,可以在回調(diào)函數(shù)中使用:
public static RetryPolicy Retry(this PolicyBuilder policyBuilder, int retryCount, Action<Exception, int, Context> onRetry);
它是一個IDictionary<string, object>類型的對象,它在Policy的執(zhí)行過程中都可以使用,如:
Policy.Handle<TimeoutException>().Retry(3, (err, countDown, context) =>
{
var method = context["method"];
ConsoleLogger.WriteLine(method);
})這個上下文對象可以在應(yīng)用策略的時候帶入:
policy.Execute(DoSomething, new Context("context")
{
["method"] = "PolicyTest"
});依賴注入
Polly也自帶了一個簡單的DI框架,方便復(fù)用Policy,使用方式如下:
var registry = new PolicyRegistry();
registry.Add("timeout & retry", Policy.Handle<TimeoutException>().Retry(3));
var policy = registry.Get<ISyncPolicy>("timeout & retry");
policy.Execute(DoSomething);當(dāng)然,也可以使用Autofac等自己喜歡的方式。
線程安全
Policy本身是線程安全的,可以并發(fā)使用同一個Policy,但如果Policy中執(zhí)行的委托有多線程問題,仍然會出現(xiàn)異常。
異步的支持
Policy對異步操作也提供了良好的支持,只需要使用相應(yīng)以Async結(jié)尾的函數(shù)即可。
var policy = Policy.Handle<TimeoutException>().RetryAsync(3); await policy.ExecuteAsync(DoSomethingAsync);
PS:有的不需要(也沒有)以Async的函數(shù),如Handle
同步上下文
對于有的異常處理,如果需要同步上下文,則需要在ExecuteAsync函數(shù)中設(shè)置continueOnCapturedContext參數(shù)為false。
var policy = Policy.Handle<TimeoutException>().RetryAsync(3); await policy.ExecuteAsync(DoSomethingAsync, CancellationToken.None, continueOnCapturedContext: true);
Cancellation的支持
Polly也支持系統(tǒng)的co-operative cancellation框架,在重試,超時,bulkhead等策略中通知執(zhí)行的委托,從而影響其行為。要使用Cancellation,需要在Excute的時候傳入CancellationToken。
policy.Execute(ct =>
{
ct.ThrowIfCancellationRequested();
}, cts.Token);具體示例在介紹彈性策略的超時策略時有介紹到。
到此這篇關(guān)于Polly實現(xiàn)執(zhí)行策略的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
RadioButtonList綁定圖片及泛型Dictionary應(yīng)用
讀取站點某一目錄的圖片,需要掌握LINQ與泛型Dictionary<TKey,TValue>的使用,本文將介紹RadioButtonList綁定圖片的實現(xiàn),感興趣的朋友可以了解下,或許對你有所幫助2013-02-02
ASP.NET 修復(fù) IIS 映射具體實現(xiàn)步驟
本文主要介紹IIS映射的具體步驟,希望對大家有所幫助。2016-05-05
Asp.net core Web Api配置swagger中文的實現(xiàn)
swagger是一個api文檔自動生動工具,還集成了在線調(diào)試. 可以為項目自動生成接口文檔, 非常的方便快捷,具有一定的參考價值,感興趣的可以了解一下2023-09-09
repeater隔行換色與鼠標(biāo)停留在上面達到變色效果
鼠標(biāo)停留在上面是變成其他的顏色,很多新手朋友都想實現(xiàn)這種效果,可是無從下手,本文整理了一些解決技巧,感興趣的朋友可以參考下啊2013-01-01
解決AJAX.NET中的懸停panel在頁面加載時閃爍的問題
AJAX.NET的兩個懸??丶?分別是HoverMenuExtender和ModalPopupExtender.他們可以打造很好的懸停效果...通常,我都是用panel來作為懸停內(nèi)容的容器..2009-06-06

