Nel mio progetto (C#, VS2010, .NET 4.0) ho un requisito che un particolare ciclo for
deve terminare entro 200 millisecondi. In caso contrario, deve terminare dopo questa durata senza eseguire le iterazioni rimanenti. Il ciclo generalmente va da i = 0
a circa da 500.000 a 700.000, quindi il tempo di ciclo totale varia.Esci dal ciclo dopo un periodo di tempo specifico in C#
Ho letto le domande seguenti che sono simili, ma non ha aiutato nel mio caso:
- 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
Finora ho provato ad utilizzare un oggetto Stopwatch
per tenere traccia il tempo trascorso ma non funziona per me. Ecco 2 metodi differenti ho provato finora:
Metodo 1. Confrontando il tempo trascorso all'interno for
ciclo:
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();
Ciò non funziona perché if (sw.Elapsed > TimeSpan.FromMilliseconds(200))
impiega 200 millisecondi per completare. Quindi inutile nel mio caso. Non sono sicuro che lo standard TimeSpan.FromMilliseconds()
richieda questo tempo o è solo nel mio caso per qualche motivo.
Metodo 2. Creazione di un thread separato per confrontare il tempo:
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();
ho qualche altro codice nel ciclo for che stampa alcune statistiche. Mi dice che in caso di Metodo 2, il ciclo for
si interrompe definitivamente prima di completare tutte le iterazioni ma il tempo di ciclo è ancora 280-300 millisecondi.
Qualche suggerimento per interrompere un ciclo for strettamente con-in 200 millisecondi o meno? Grazie.
Come su uccidere il thread che esegue quel ciclo? Potrebbe non essere l'ideale però. –
http://stackoverflow.com/questions/5945533/how-to-execute-the-loop-for-specific-time – akhil
@Filip Ekberg, buon punto! Hai bisogno di aggiustarlo. :) Tuttavia potrebbe non aiutarmi a risolvere il mio problema. È comunque una buona pratica. Grazie. – silverspoon