Выйти из цикла через определенное время в C#

В моем проекте (C #, VS2010,.NET 4.0 )есть требование, чтобы конкретный цикл forзавершался в течение 200 миллисекунд. Если это не так, то он должен завершиться по истечении этого времени без выполнения оставшихся итераций. Цикл обычно продолжается от i = 0до примерно 500 000–700 000, поэтому общее время цикла варьируется.

Я прочитал следующие вопросы, которые похожи, но они не помогли в моем случае:

  1. Как лучше всего выйти из цикла по прошествии 30 мс в C++
  2. Как выполнить цикл за определенное время

До сих пор я пытался использовать объект Stopwatchдля отслеживания прошедшего времени, но у меня это не работает. Вот 2 разных метода, которые я пробовал до сих пор:

Способ 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 миллисекунд или меньше? Спасибо.

11
задан Community 23 May 2017 в 12:10
поделиться