想要讓設定程式過多久後去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
2.測試程式如下,
// 設定要 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 ,如下,
參考資料
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^