Я бы выполнил это:
public static bool Retry(int maxRetries, Func<bool, bool> method)
{
while (maxRetries > 0)
{
if (method(maxRetries == 1))
{
return true;
}
maxRetries--;
}
return false;
}
Я бы не использовал исключения, как они используются в других примерах. Мне кажется, что если мы ожидаем, что метод не удастся, его отказ не является исключением. Таким образом, метод, который я вызываю, должен возвращать true, если он преуспел, и false, если он потерпел неудачу.
Почему это Func<bool, bool>
, а не только Func<bool>
? Поэтому, если я хочу , чтобы метод мог генерировать исключение при ошибке, у меня есть способ сообщить ему, что это последняя попытка.
Поэтому я могу использовать его с кодом типа:
Retry(5, delegate(bool lastIteration)
{
// do stuff
if (!succeeded && lastIteration)
{
throw new InvalidOperationException(...)
}
return succeeded;
});
или
if (!Retry(5, delegate(bool lastIteration)
{
// do stuff
return succeeded;
}))
{
Console.WriteLine("Well, that didn't work.");
}
Если передача параметра, который метод не использует, доказывает быть неудобным, тривиально реализовать перегрузку Retry
, которая просто принимает значение Func<bool>
.
Нет, Linux может отложить выделение физической памяти, запрошенное mmap
, до тех пор, пока эта память не будет доступна.
Когда приложение обращается к неотображенной памяти, срабатывает исключение сбоя страницы ; при обработке этого исключения Linux может отображать доступ к памяти, что позволяет приложению продолжать работу.