我计算了我的基本测试应用程序的例外情况。我期待异常,我们正在测试SQL高可用性故障转移期间的应用程序行为。当服务器故障转移时,会出现一个闪烁期,短暂地会出现一些异常。我在catch中有一些基本的重试逻辑来计算和处理/重试具有异常的操作。这是我的代码。
我的重试课程:
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个例外?这里是否有重置我的时间跨度或重试计数?
答案 0 :(得分:0)
我认为Timespan没有被正确传递,但我错了。我需要将初始SQL插入分解为它自己的方法。问题是我的重试,这是一个尝试捕获重试一个动作(),其中有原始的try / catch。这导致了尝试捕获中的各种循环,这就是为什么我有这么多例外。我将插入本身分离为一个方法,然后在第一次尝试时引用它,如果有异常,它将被发送到我的重试,它使用相同的SQL方法(而不是使用与Try / Catch相同的SQL插入)。这就是现在的样子。
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);
}
}
这个游戏还是个新手。我愿意接受评论,但这段代码正常运作。我的异常计数是正常的,我的重试次数正在递减。