Mam wymagania w moim projekcie (C#, VS2010, .NET 4.0), że konkretna pętla for
musi zakończyć się w ciągu 200 milisekund. Jeśli tak się nie stanie, musi zakończyć się po tym czasie bez wykonywania pozostałych iteracji. Pętla ogólnie idzie od i = 0
do około 500 000 do 700 000, więc całkowity czas pętli zmienia się.Zakończ pętlę po określonym czasie w C#
Znam następujące pytania, które są podobne, ale nie pomogło w moim przypadku:
- What is the best way to exit out of a loop after an elapsed time of 30ms in C++
- How to execute the loop for specific time
Do tej pory próbowałem za pomocą Stopwatch
obiekt do śledzenia czas, który minął, ale nie działa dla mnie. Tu są 2 różne sposoby próbowałem dotąd:
Metoda 1. Porównywanie upływ czasu w ciągu for
pętli:
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();
To nie działa, ponieważ if (sw.Elapsed > TimeSpan.FromMilliseconds(200))
trwa dłużej niż 200 milisekund, aby zakończyć. Stąd bezużyteczny w moim przypadku. Nie jestem pewien, czy to trwa tak długo, czy jest to w moim przypadku z jakiegoś powodu.
Metoda 2. Tworzenie oddzielnego wątku porównać czas:
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();
mam jakiś inny kod w pętli for, która drukuje kilka statystyk. Mówi mi, że w przypadku metody 2, pętla for
zdecydowanie zrywa się przed zakończeniem wszystkich iteracji, ale czas pętli jest nadal 280-300 milisekund.
Jakieś sugestie dotyczące przerwania pętli for z dokładnością do 200 milisekund lub mniej? Dzięki.
Co powiesz na zabicie wątku, który uruchamia tę pętlę? Może nie jest jednak idealny. –
http://stackoverflow.com/questions/5945533/how-to-execute-the-loop-for-specific-time – akhil
@Filip Ekberg, Dobry punkt! Trzeba to naprawić. :) Jednak może nie pomoże mi to naprawić mojego problemu. To dobra praktyka. Dzięki. – silverspoon