2011-02-16 20 views
6

È una cattiva pratica utilizzare tale ciclo? Forse è meglio usare il cronometro, o forse questa soluzione ha qualche insidia?Implementare il timeout 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)); 

    } 

Ho visto questo articolo Implement C# Generic Timeout, ma è troppo complesso da utilizzare in scenari semplici - è necessario pensare di sincronizzazione dei thread, è corretto per interrompere o meno e così via.

+3

Cosa vuoi fare con Creazione di un timeout esattamente? Se dici tutto il tuo scenerio, forse possiamo offrire un modo diverso di usare. –

+0

Correlati/duplicati: http://stackoverflow.com/questions/3195030/thread-timeout-in-c – RQDQ

+0

Basta smettere di lavorare dopo un certo periodo di tempo - iniziare a lavorare, se funziona più di 10 minuti interrompere il lavoro. Il thread che chiama il metodo può essere bloccato. – anderhil

risposta

15

Come ho capito, vuoi che il tuo metodo funzioni un po 'fino a quando non è finito o prima che sia trascorso un certo periodo di tempo? Vorrei usare una Stopwatch per questo, e controllare il tempo trascorso in un ciclo:

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

Grazie per la risposta. All'inizio pensavo a Stopwatch, poi ho deciso che DateTime è più semplice, puoi spiegare perché Stopwatch è migliore? Ho pensato che fosse l'implementazione basata su DateTime ... – anderhil

+1

@anderhil: Penso che il cronometro sia molto più leggibile :). L'unico altro vantaggio rispetto a DateTime.Ora è che il cronometro * può * avere una risoluzione più alta (non che sia importante per il tuo problema, però). –

+8

Non userei 'DateTime' perché la data può cambiare sotto di me come Daylight Saving Time. Potrebbe far sì che il codice attenda troppo a lungo (un'ora e 10 minuti) o il codice potrebbe non attendere abbastanza a lungo. Ma 'Cronometro' sa quanti minuti sono trascorsi, indipendentemente da che ora sia. –

2

È preferibile utilizzare la classe System.Timers.Timer.

+2

Questo non è ciò che il timer è per. –

+0

Sì, ma quello che stavo cercando ...: D "Timeout" può essere fuorviante, perché il metodo 'setTimeout()' di Javascript fa effettivamente ciò che 'System.Timers.Timer' fa in C#. –

Problemi correlati