[.NET]使用 Polly 來讓程式有 Retry 的機制

想要讓設定程式過多久後去Retry嗎?
您可以使用 Polly 哦!

有時程式在呼叫其他Service時,如果暫時連線不通的話,可以透過 Polly 來控制 Retry 哦!

使用方式如下,

1.定義我們要Handle的Exception有那些


Policy.Handle<DivideByZeroException>()
			.Or<FormatException>()

 

2.Exception發生了,要如何處理,如 Retry 幾次、一直Retry下去,等多久後再Retry,


// Retry multiple times, calling an action on each retry 
// with the current exception, retry count and context 
// provided to Execute()
Policy
    .Handle<DivideByZeroException>()
    .Retry(3, (exception, retryCount, context) =>
    {
        // do something 
    });

 

3.將程式與 Polly 組合起來,如下,


// Execute a function returning a result passing arbitrary context data
var policy = Policy
    .Handle<DivideByZeroException>()
    .Retry(3, (exception, retryCount, context) =>
    {
        object methodThatRaisedException = context["methodName"];
        Log(exception, methodThatRaisedException)
    });

var result = policy.Execute(
    () => DoSomething(),
    new Dictionary<string, object>() {{ "methodName", "some method" }}
);

 

例如建立一個 Windows Form程式來Demo程式發生錯誤時,每3秒重新執行一次,如下,

1.從NuGet中加入 Polly

image

 

2.測試程式如下,

image


// 設定要 Handle DivideByZeroException 及 FormatException
var policy = Policy.Handle<DivideByZeroException>()
	.Or<FormatException>()
	.WaitAndRetry(3 
	, retryAttempt => TimeSpan.FromSeconds(3)  
	, (exception, timespan, context) =>
	{
		txtDividend.Text = "10";
		txtDivisor.Text = "1";
		MessageBox.Show(string.Format("name:{0}, timespan:{1}", context["name"], timespan));
	});

//用Polly包住要執行的程式
policy.Execute(() =>
	{
		int dividend = int.Parse(txtDividend.Text);
		int divisor = int.Parse(txtDivisor.Text);
		lblResult.Text = (dividend / divisor).ToString();
	},
new Dictionary<string, object>() { { "name", "Rainmaker!!!" } });

 

所以如果一開始 被除數 及 除數 都沒輸入值,會進到 Retry 去,並設定值為 10 及 1 ,如下,

image

image

image

 

參考資料

Polly

Circuit Breaking With Polly