.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); })
這個上下文對象可以在應用策略的時候帶入:
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本身是線程安全的,可以并發(fā)使用同一個Policy,但如果Policy中執(zhí)行的委托有多線程問題,仍然會出現(xiàn)異常。
異步的支持
Policy對異步操作也提供了良好的支持,只需要使用相應以Async結(jié)尾的函數(shù)即可。
var policy = Policy.Handle<TimeoutException>().RetryAsync(3); await policy.ExecuteAsync(DoSomethingAsync);
PS:有的不需要(也沒有)以Async的函數(shù),如Handle
同步上下文
對于有的異常處理,如果需要同步上下文,則需要在ExecuteAsync函數(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);
具體示例在介紹彈性策略的超時策略時有介紹到。
到此這篇關于Polly實現(xiàn)執(zhí)行策略的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
ASP.NET Core 使用Cookie驗證身份的示例代碼
這篇文章主要介紹了ASP.NET Core 使用Cookie驗證身份的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02ASP.NET Ajax級聯(lián)DropDownList實現(xiàn)代碼
我想大家對Ajax已耳熟能詳。自web 2.0概念出現(xiàn)以后,提供更好的用戶體驗變得越來越重要。那么今天我來講解一下如何使用ASP.NET Ajax和web service構(gòu)建無刷新級聯(lián)DropDownList(以下簡稱為級聯(lián)DDL)。完成的效果圖2008-12-12使用NLog給Asp.Net Core做請求監(jiān)控的方法
這篇文章主要介紹了使用NLog給Asp.Net Core做請求監(jiān)控的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05ASP.NET性能優(yōu)化之構(gòu)建自定義文件緩存
ASP.NET的輸出緩存(即靜態(tài)HTML)在.NET4.0前一直是基于內(nèi)存的。這意味著如果我們的站點含有大量的緩存,則很容易消耗掉本機內(nèi)存。2011-09-09MVC4 基礎 枚舉生成 DropDownList 實用技巧
本篇文章小編為大家介紹,MVC4 基礎 枚舉生成 DropDownList 實用技巧。需要的朋友參考下2013-04-04asp.net Repeater之非常好的數(shù)據(jù)分頁
asp.net Repeater之非常好的數(shù)據(jù)分頁實現(xiàn)代碼。2009-07-07