2011-02-16 24 views
6

¿Es una mala práctica utilizar dicho ciclo while? Tal vez es mejor usar el cronómetro, o tal vez esta solución tiene algunos escollos?Implemente el tiempo de espera de C#

public void DoWork() 
    { 
     //do some preparation 
     DateTime startTime = DateTime.Now; 
     int rowsCount = 0; 
     int finalCount = getFinalCount(); 
     do 
     { 
      Thread.Sleep(1000); 
      rowsCount = getRowsCount(); // gets rows count from database, rows are added by external app. 
     } while (rowsCount < finalCount && DateTime.Now - startTime < TimeSpan.FromMinutes(10)); 

    } 

vi este artículo Implement C# Generic Timeout, pero es demasiado complejo para su uso en escenarios simples - es necesario pensar acerca de sincronización de hilos, que es adecuada para abortar o no y así sucesivamente.

+3

¿Qué desea hacer con la Creación de un tiempo de espera exactamente? Si le dices a tu escenario completo, tal vez podamos ofrecer una forma diferente de usarlo. –

+0

Relacionado/duplicado: http://stackoverflow.com/questions/3195030/thread-timeout-in-c – RQDQ

+0

Solo tiene que dejar de trabajar después de un período de tiempo - comience a trabajar, si se ejecuta más de 10 minutos interrumpa el trabajo. El hilo que llama al método puede ser bloqueado. – anderhil

Respuesta

15

Según tengo entendido, ¿quiere que su método haga algún trabajo hasta que termine o hasta que haya transcurrido un período de tiempo? Me gustaría utilizar un Stopwatch para eso, y comprobar el tiempo transcurrido en un bucle:

void DoWork() 
{ 
    // we'll stop after 10 minutes 
    TimeSpan maxDuration = TimeSpan.FromMinutes(10); 
    Stopwatch sw = Stopwatch.StartNew(); 
    DoneWithWork = false; 

    while (sw.Elapsed < maxDuration && !DoneWithWork) 
    { 
     // do some work 
     // if all the work is completed, set DoneWithWork to True 
    } 

    // Either we finished the work or we ran out of time. 
} 
+0

Gracias por la respuesta. Pensé en Cronómetro al principio, luego decidí que DateTime es más simple, ¿puedes explicar por qué Cronómetro es mejor? Pensé que era una implementación basada en DateTime ... – anderhil

+1

@anderhil: Creo que Stopwatch es mucho más legible :). La única otra ventaja sobre DateTime.Now es que Cronómetro * puede * tener una resolución más alta (aunque eso no importa para usted). –

+8

No utilizaría 'DateTime' porque la fecha puede cambiar debajo de mí viene el horario de verano. Podría hacer que el código espere demasiado tiempo (una hora y 10 minutos) o podría hacer que el código no espere lo suficiente. Pero 'Cronómetro' sabe cuántos minutos han transcurrido, independientemente de la hora que sea. –

2

Es mejor usar la clase System.Timers.Timer.

+2

Eso no es para lo que es el temporizador. –

+0

Sí, pero lo que estaba buscando ...: D "Timeout" puede ser engañoso, porque el método 'setTimeout()' de Javascript realmente hace lo que 'System.Timers.Timer' hace en C#. –

Cuestiones relacionadas