У меня есть требование в моем проекте (С#, VS2010,.NET 4.0), что конкретный цикл for
должен завершиться в течение 200 миллисекунд. Если это не так, оно должно завершиться после этой продолжительности без выполнения оставшихся итераций. Обычно петля имеет значение i = 0
примерно от 500 000 до 700 000, поэтому общее время цикла изменяется.
Я прочитал следующие вопросы, которые похожи, но они не помогли в моем случае:
- Какой лучший способ выйти из цикла по истечении 30 мс на С++
- Как выполнить цикл для определенного времени
До сих пор я пытался использовать объект Stopwatch
для отслеживания прошедшего времени, но он не работает для меня. Вот два разных метода, которые я пробовал до сих пор:
Метод 1. Сравнение прошедшего времени в цикле for
:
Stopwatch sw = new Stopwatch();
sw.Start();
for (i = 0; i < nEntries; i++) // nEntries is typically more than 500,000
{
// Do some stuff
...
...
...
if (sw.Elapsed > TimeSpan.FromMilliseconds(200))
break;
}
sw.Stop();
Это не работает, потому что if (sw.Elapsed > TimeSpan.FromMilliseconds(200))
занимает более 200 миллисекунд. Следовательно, бесполезно в моем случае. Я не уверен, что TimeSpan.FromMilliseconds()
обычно занимает это долгое время, или это только в моем случае по какой-то причине.
Способ 2. Создание отдельного потока для сравнения времени:
Stopwatch sw = new Stopwatch();
sw.Start();
bool bDoExit = false;
int msLimit = 200;
System.Threading.ThreadPool.QueueUserWorkItem((x) =>
{
while (bDoExit == false)
{
if (sw.Elapsed.Milliseconds > msLimit)
{
bDoExit = true;
sw.Stop();
}
System.Threading.Thread.Sleep(10);
}
});
for (i = 0; i < nEntries; i++) // nEntries is typically more than 500,000
{
// Do some stuff
...
...
...
if (bDoExit == true)
break;
}
sw.Stop();
У меня есть другой код в цикле for, который печатает некоторые статистические данные. Он сообщает мне, что в случае метода 2 цикл for
определенно прерывается до завершения всех итераций, но время цикла составляет 280-300 миллисекунд.
Любые предложения по разрыву цикла for строго с-в 200 миллисекундах или меньше? Спасибо.