試煉12 - 開始練習組合技2 委派 + 泛型

2022 鐵人賽文 搬回點部落

開始試煉

委派 (delegate Func Action) 是我在面試工程師時 一定會問到的部分
常聽到的回答有三種

  1. 沒聽過委派
  2. 大概知道委派 但是沒用過
  3. 知道也有用過

最常聽到的順序 是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;
    }
}

整體核心邏輯就是 懂得運用 委派 將需要重試的方法傳入

結束試煉

委派的好用 不只是這樣而已,只要熟悉之後常常都可以運用在開發中

如果內容有誤請多鞭策謝謝