Tengo un requisito en mi proyecto (C#, VS2010, .NET 4.0) que un bucle particular for
debe terminar dentro de los 200 milisegundos. Si no lo hace, entonces tiene que terminar después de esta duración sin ejecutar las iteraciones restantes. El bucle generalmente va para i = 0
a alrededor de 500,000 a 700,000, por lo que el tiempo total de bucle varía.Salir del ciclo después de una hora específica en C#
He leído las preguntas siguientes que son similares pero no ayudó en mi 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
Hasta aquí he intentado usar un objeto para realizar un seguimiento Stopwatch
el tiempo transcurrido, pero no funciona para mí. Aquí hay 2 métodos diferentes que he probado hasta ahora:
Método 1. comparar el tiempo transcurrido dentro for
bucle:
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();
Esto no funciona porque if (sw.Elapsed > TimeSpan.FromMilliseconds(200))
lleva más de 200 milisegundos en completarse. De ahí que sea inútil en mi caso. No estoy seguro de si TimeSpan.FromMilliseconds()
generalmente toma tanto tiempo o simplemente está en mi caso por alguna razón.
método 2. Creación de un hilo separado para comparar el tiempo:
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();
tengo algún otro código en el bucle for que imprime algunas estadísticas. Me dice que en el caso del Método 2, el ciclo for
definitivamente se rompe antes de completar todas las iteraciones, pero el tiempo del ciclo sigue siendo 280-300 milisegundos.
¿Alguna sugerencia para romper un bucle estrictamente dentro de 200 milisegundos o menos? Gracias.
¿Qué tal matar el hilo que ejecuta ese bucle? Sin embargo, podría no ser ideal. –
http://stackoverflow.com/questions/5945533/how-to-execute-the-loop-for-specific-time – akhil
@Filip Ekberg, buen punto! Necesito arreglarlo :) Sin embargo, puede que no me ayude a solucionar mi problema. Sin embargo, es una buena práctica. Gracias. – silverspoon