2011-02-16 40 views
6

Czy używanie tej pętli jest złym rozwiązaniem? Może lepiej jest użyć stopera, a może to rozwiązanie ma pewne pułapki?Implementacja C# timeout

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)); 

    } 

Widziałem ten artykuł Implement C# Generic Timeout, ale jest zbyt złożona, aby korzystać w prostych scenariuszy - trzeba myśleć o synchronizacji wątków, jest to właściwe, aby je przerwać, czy nie i tak dalej.

+3

Co chcesz zrobić z Tworzenie timeout dokładnie? Jeśli powiesz całe swoje scenerio, może zaoferujemy inny sposób użycia. –

+0

Podobne/duplikat: http://stackoverflow.com/questions/3195030/thread-timeout-in-c – RQDQ

+0

Po prostu trzeba przerwać pracę po pewnym czasie - rozpocząć pracę, jeśli trwa dłużej niż 10 minut, zatrzymaj pracę. Wątek, który wywołuje tę metodę, może zostać zablokowany. – anderhil

Odpowiedz

15

Jak rozumiem, chcesz, aby twoja metoda wykonywała jakąś pracę, dopóki nie zostanie ukończona lub dopóki nie upłynie pewien okres czasu? Chciałbym użyć Stopwatch za to, i sprawdzić czas, który upłynął w pętli:

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

Dzięki za odpowiedź. Początkowo myślałem o Stopwatch, potem zdecydowałem, że DateTime jest prostsze, czy możesz wyjaśnić, dlaczego Stoper jest lepszy? Myślałem, że jest to implementacja oparta na DateTime ... – anderhil

+1

@anderhil: Myślę, że Stoper jest o wiele bardziej czytelny :). Jedyną przewagą nad DateTime.Now jest to, że Stopwatch * może * mieć wyższą rozdzielczość (nie ma to jednak znaczenia dla ciebie). –

+8

Nie użyłbym opcji 'DateTime', ponieważ data może się zmienić pod moim adresem. Czas letni. Może to spowodować, że kod będzie czekać zbyt długo (godzinę i 10 minut) lub może spowodować, że kod nie będzie długo czekać. Ale "Stoper" wie, ile minut minęło, bez względu na to, która jest godzina. –

2

Lepiej jest używać klasy System.Timers.Timer.

+2

Nie do tego służy Timer. –

+0

Tak, ale to, czego szukałem ...: D "Timeout" może wprowadzać w błąd, ponieważ metoda 'setTimeout()' Javascriptu faktycznie robi to, co 'System.Timers.Timer' robi w języku C#. –