Мне нужен метод, который пытается обновить таблицу несколько раз. Это была моя первая попытка.
void UpdateSomeSQLRows(uint retryCount = 3)
{
try
{
// Some Code
}
catch (Exception e)
{
retryCount--;
if (retryCount != 0)
UpdateSomeSQLRows(retryCount);
}
}
Будет ли он надежно работать для обновлений sql с помощью собственного Microsoft sqlclient?
Возможно, это немного основано на мнениях, но... Лично я бы выбрал цикл вместо рекурсии. Внутри цикла вы можете перехватывать исключения (и регистрировать их, даже в виде предупреждений/информации) и обновлять счетчик повторных попыток, который управляет циклом. Если количество повторных попыток превышает заданное значение, создается новое исключение. (Или верните какое-то значение по умолчанию или что-то еще, что вы хотите сделать, если операция не удалась.)
это молча проглатывает исключения, если все 3 раза происходит сбой; может catch (Exception) when (retryCount > 0)
? хотя я ненавижу здесь рекурсию
Вы уменьшаете retryCount ненужное время.
Кстати, если вы вызовете свой метод с помощью UpdateSomeSQLRows(0), у вас будет около 4 миллиардов повторов.
@SomeBody, как насчет: проверено { retryCount--; } внутри подхвата
Существует библиотека Polly, которая хорошо справляется с этой задачей и имеет множество расширенных функций. Это также приведет к распространению исключения на вызывающую функцию после последней повторной попытки вместо молчаливого сбоя, а также добавит задержку между каждой попыткой.
internal class Program
{
private static Policy retrySqlPolicy =
Policy
.Handle<Exception>()
.WaitAndRetry(3, retryAttempt => TimeSpan.FromSeconds(2));
static void Main(string[] args)
{
UpdateSomeSQLRows();
}
static void UpdateSomeSQLRows()
{
retrySqlPolicy.Execute(() =>
{
// Some Code
});
}
}
Только один метод, никакого класса или объекта — этот код вообще не объектно-ориентирован.