异常重试次数高于预期
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);
}
}
对游戏还是很陌生。我愿意接受评论,但这段代码可以正常工作。我的异常计数是正常的,我的重试次数正在减少。
我正在计算基本测试应用程序的异常。我期待异常,我们正在 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);
}
}
对游戏还是很陌生。我愿意接受评论,但这段代码可以正常工作。我的异常计数是正常的,我的重试次数正在减少。