您好,登錄后才能下訂單哦!
本篇內容介紹了“C#中異常執行重試的實現方法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
重試模式,是應用在異常處理中,發生異常的時候,能夠對業務程序進行重新調用,在實際中,可以使用Polly提供穩定,簡單的用法,自己實現主要是對模式的一種了解。
public class RetryPattern { /** * 重試模式可以用Polly替代 * 自己實現一種模式 */ #region 構造函數 public RetryPattern() { } #endregion 構造函數 #region 變量 private uint MaxTryCount; // 最大重試次數 private uint CurrentTryCount; // 當前重試的次數 private bool RunResult = true; // 執行結果 #endregion 變量 #region 方法 #region 設置最大重試次數 public void SetMaxCount(uint tryCount) { // 校驗 if (tryCount == 0) throw new ArgumentException("重試次數不能為0"); MaxTryCount = tryCount; } #endregion 設置最大重試次數 #region 是否需要重試 public bool IsRetry() { if (RunResult || CurrentTryCount == MaxTryCount) return false; else { RunResult = true; return true; } } #endregion 是否需要重試 #region 獲取當前重試次數 public uint GetCurrentTryCount() { return CurrentTryCount + 1; } #endregion 獲取當前重試次數 #region 重試 public void RetryHandle() { RunResult = false; CurrentTryCount++; } #endregion 重試 #endregion 方法 }
ps:下面通過代碼看下C# 異常重試策略
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Polly; using Polly.Bulkhead; using Polly.CircuitBreaker; using Polly.Fallback; using Polly.NoOp; using Polly.Registry; using Polly.Retry; using Polly.Timeout; using Polly.Utilities; using Polly.Wrap; using System.Net.Http; namespace CircuitBreak_Test { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { try { var retryTwoTimesPolicy = Policy .Handle<DivideByZeroException>() .Retry(3, (ex, count) => { Console.WriteLine("執行失敗! 重試次數 {0}", count); Console.WriteLine("異常來自 {0}", ex.GetType().Name); }); retryTwoTimesPolicy.Execute(() => { Compute(); }); } catch (DivideByZeroException e1) { Console.WriteLine($"Excuted Failed,Message: ({e1.Message})"); } Policy policy = Policy.Handle<TimeoutException>() .WaitAndRetryAsync(5, retryAttempt => TimeSpan.FromSeconds(5), (exception, retryCount) => { //logger.Error(exception); string xx = ""; }); var result = policy.ExecuteAsync(() => Test()); Policy _circuitBreakerPolicy = Policy .Handle<HttpRequestException>() .Or<TimeoutRejectedException>() .Or<TimeoutException>() .CircuitBreakerAsync( exceptionsAllowedBeforeBreaking: 5, durationOfBreak: new TimeSpan(), onBreak: (ex, breakDelay) => { }, onReset: () => { }, onHalfOpen: () => { } ); var fallBackPolicy = Policy<string> .Handle<Exception>() .Fallback("執行失敗,返回Fallback"); var fallBack = fallBackPolicy.Execute(() => { throw new Exception(); }); Console.WriteLine(fallBack); } static int Compute() { var a = 0; return 1 / a; } private static async Task Test() { using (HttpClient httpClient = new HttpClient()) { var response = httpClient.GetAsync("http://news1.cnblogs.com/Category/GetCategoryList?bigCateId=11&loadType=0").Result; await response.Content.ReadAsStringAsync(); } } } }
“C#中異常執行重試的實現方法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。