Прекратите запуск кода через 15 секунд

Я пытаюсь написать что-то, чтобы остановить выполнение кода после 15 секунд работы.

Я не хочу While цикл или любой вид цикла, который будет использоваться, и вместо этого я хотел бы использовать условия IF-ELSE, так как мне было бы легче в моем коде.

Часть кода, которую я хочу прекратить выполнять через 15 секунд, - это сам цикл FOR. Давайте рассмотрим код ниже, например:

for (int i = 1; i < 100000; i++)
{
    Console.WriteLine("This is test no. "+ i+ "\n");
}

Как бы вы остановили этот цикл после 15 секунд работы?

3 ответа

Решение

Вы можете назначить переменную DateTime перед циклом, имеющим текущие дату и время, затем в каждой итерации цикла просто проверьте, прошло ли 15 секунд:

DateTime start = DateTime.Now;
for (int i = 1; i < 100000; i++)
{
    if ((DateTime.Now - start).TotalSeconds >= 15)
        break;
    Console.WriteLine("This is test no. "+ i+ "\n");
}

Обновление: хотя вышеприведенное обычно будет работать, оно не является пуленепробиваемым и может потерпеть неудачу в некоторых крайних случаях (как указал Сервис в комментарии), вызывая бесконечный цикл. Лучшая практика будет использовать Stopwatch класс, который является частью пространства имен System.Diagnostics:

Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 1; i < 100000; i++)
{
    if (watch.Elapsed.TotalMilliseconds >= 500)
        break;
    Console.WriteLine("This is test no. " + i + "\n");
}
watch.Stop();

Я публикую свой ответ из моего старого поста, потому что он более актуален здесь,

Я думаю, что вам нужно измерить время и остановить код после определенного времени, скажем "15 секунд", StopWatch класс может помочь вам

// Create new stopwatch instance
Stopwatch stopwatch = new Stopwatch();
// start stopwatch
stopwatch.Start();
// Stop the stopwatch
stopwatch.Stop();
// Write result
Console.WriteLine("Time elapsed: {0}",stopwatch.Elapsed);
// you can check for Elapsed property when its greater than 15 seconds 
//then stop the code

Elapsed свойство возвращает экземпляр TimeSpan, вы бы сделали что-то вроде этого.

TimeSpan timeGone = stopwatch.Elapsed;

Чтобы соответствовать вашему сценарию, вы можете сделать что-то вроде этого

Stopwatch stopwatch = new Stopwatch();
TimeSpan timeGone;
// Use TimeSpan constructor to specify:
// ... Days, hours, minutes, seconds, milliseconds.
// ... The TimeSpan returned has those values.
TimeSpan RequiredTimeLine = new TimeSpan(0, 0, 0, 15, 0);//set to 15 sec

While ( timeGone.Seconds < RequiredTimeLine.Seconds )
{
    stopwatch.Start();
    Start();
    timeGone = stopwatch.Elapsed;
}
Stop();//your method which will stop listening

Несколько полезных ссылок
MSDN StopWatch

Лучше вы можете использовать приведенный ниже код, который поможет улучшить производительность.

System.Threading.Thread.Sleep(TimeSpan.FromSeconds(2));
Другие вопросы по тегам