2022 鐵人賽文 搬回點部落
開始試煉
委派 (delegate Func Action) 是我在面試工程師時 一定會問到的部分
常聽到的回答有三種
- 沒聽過委派
- 大概知道委派 但是沒用過
- 知道也有用過
最常聽到的順序 是2 1 3 用的人不算多
委派其實非常好用,利用這次試煉來分享一個委派的例子
先聲明
Polly 是強大的重試套件
如果有相關的需求可以先研究看看Polly
[.NET]開發人員不可缺少的重試處理利器 Polly
先說明情境
有一支第三方API 時好時壞 但是反應原廠 得到的回答都是API沒問題喔
一方面要讓我的程式可以運作,另一方面也想蒐集證據
所以我想要有一個機制
1.重試機制
2.如果透過重試成功 要記錄重試第幾次成功
3.重試失敗時 紀錄錯誤訊息
4.如果一次成功 就不用特別記錄
範例程式碼如下
public class RetryHelper
{
private static readonly Logger _logger = LogManager.GetLogger("Retry");
public static TResult TryWithDelay<TResult>(Func<TResult> func, int maxRetries, int delayInMilliseconds)
{
TResult returnValue = default;
int numTries = 0;
bool succeeded = false;
Exception lastException = null;
while (numTries < maxRetries)
{
try
{
returnValue = func();
succeeded = true;
}
catch (Exception ex)
{
lastException = ex;
numTries++;
}
if (succeeded == true && numTries > 0)
{
_logger.Info($"Retry successfully at {numTries}/{maxRetries}");
}
if (succeeded == true)
{
return returnValue;
}
if (numTries < maxRetries)
{
Thread.Sleep(delayInMilliseconds);
_logger.Info($"Start Retry {numTries}/{maxRetries} : {lastException}");
}
}
_logger.Info($"方法重試失敗 : {lastException}");
return returnValue;
}
}
整體核心邏輯就是 懂得運用 委派 將需要重試的方法傳入
結束試煉
委派的好用 不只是這樣而已,只要熟悉之後常常都可以運用在開發中
如果內容有誤請多鞭策謝謝