异常重试次数高于预期

Exception retry attempts are higher than expected

我正在计算基本测试应用程序的异常。我期待异常,我们正在 SQL 高可用性故障转移期间测试应用程序的行为。当服务器故障转移时会有一个闪烁期,短暂地预期会出现一些异常。我的 catch 中有一些基本的重试逻辑来计算和处理/重试有异常的操作。这是我的代码。

我重试class:

public static class Retry
{
    public static void DoWithRetry(Action action, TimeSpan sleepPeriod, int retryCount = 3)
    {
        while (true)
        {
            try
            {
                action();
                break; // success!
            }
            catch
            {
                if (--retryCount == 0) throw;
                else Thread.Sleep(sleepPeriod);
            }
        }
    }


}

这是我在捕获中引用它的地方:

catch (Exception ex)
{
    ExCounter++;
    Retry.DoWithRetry(DbInsertTestTable, TimeSpan.FromSeconds(1), retryCount: 3);
    //AppCount.Text = ex.Message;
}

重试有效,但我的异常计数似乎减少了,因为我已经超过 100 个。如果我关闭重试,我只会得到大约 5 个异常的平均值。使用重试逻辑,我希望它在 1 秒时间跨度睡眠后重试操作,最多尝试 3 次。我如何获得超过 100 个异常?这里是否有重置我的时间跨度或重试次数的回传?

我以为时间跨度没有被正确传递,但我错了。我需要将初始 SQL 插入到它自己的方法中。问题是我的重试,这是一个 try catch 正在重试其中包含原始 try/catch 的 action() 。这导致了 try catch 中的各种循环,这就是为什么我有这么多异常。我将插入本身分离到一个方法中,然后在第一次尝试时引用它,如果有异常,它会被发送到我的重试,它使用相同的 SQL 方法(而不是使用相同的 SQL 插入Try/Catch)。这是它现在的样子。

private void DbInsertTestTable()
{

    string User = System.Web.HttpContext.Current.User.Identity.Name.ToString();
    string ServName = "";
    string SqlStatement = "INSERT INTO [myDB].[dbo].[mytable] ([AppCounterData],[User],[DateTime],[ServName]) VALUES (@COLUMN1,@COLUMN2,@COLUMN3,@@ServerName);";

    using (SqlConnection c = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["webconfconstringname"].ConnectionString))
    {
        SqlCommand cmd = SqlCmdQuery(c, SqlStatement);
        cmd.Parameters.AddWithValue("@COLUMN1", AppCounter);
        cmd.Parameters.AddWithValue("@COLUMN2", User);
        cmd.Parameters.AddWithValue("@COLUMN3", DateTime.Now);
        cmd.Parameters.AddWithValue("@COLUMN4", ServName);
        SqlCmdOpExCl(c, cmd);
    }
}


private void SqlInsertFirstAttempt()
{
    try
    {
        DbInsertTestTable();
    }
    catch (SqlException sqlEx)
    {
        DoWithRetry(DbInsertTestTable, TimeSpan.FromSeconds(1), retryCount: 30);
    }           
 }

对游戏还是很陌生。我愿意接受评论,但这段代码可以正常工作。我的异常计数是正常的,我的重试次数正在减少。