Зависит от логики. Если, как показано ниже, то можно использовать
continue:
int i = 0;
bool b = false;
while (i < 10)
{
Console.WriteLine("Текущее: {0}", i);
if (i == 5 && !b)
{
b = true;
continue;
}
i++;
}
В крайнем случае есть
goto:
int i = 0;
bool b = false;
while (i < 10)
{
again: // точка возврата
Console.WriteLine("Текущее: {0}", i);
if (i == 5 && !b)
{
b = true;
goto again;
}
i++;
}
Посмотреть online-пример
Однако не следует злоупотреблять подобными переходами. От обилия операторов
goto в коде, у программиста может случиться разрыв мозга, что приведет к неминуемой гибели проекта и его возрождению в новом виде, если, конечно, сам программист не скопытится. Травма та серьезная :-) Если есть возможность, желание и время, лучше изменить логику так, чтобы не приходилось делать такие «прыжки».
Для получения файлов или вообще работы с файлами (ожидание доступа для чтения или удаления, получение данных из сети и т.п.), можно использовать вложенный цикл, который будет пробовать выполнить задачу до тех пор, пока она будет успешно выполнена или не истечет отведенное время на выполнение задачи (или количество попыток):
// пауза между попытками (100 мс)
var interval = new TimeSpan(0, 0, 0, 0, 100);
// максимальное время ожидания (1 секунда)
var timeout = new TimeSpan(0, 0, 0, 1);
while (true)
{
var totalTime = new TimeSpan(); // счетчик времени
var заданиеВыполнено = false;
while(!заданиеВыполнено) // повторять, пока задание не будет выполнено
{
try
{
// тут код задания
// если ошибок не будет, то
заданиеВыполнено = true; // работа цикла будет завершена
}
catch
{
// если ошибка, делаем паузу
System.Threading.Thread.Sleep(100);
// увеличиваем счетчик времени
totalTime += interval;
if (totalTime > timeout)
{
// превышен таймаут, выходим
Console.WriteLine("Превышено время ожидания");
break;
}
}
}
}