2011-02-16 27 views
6

Böyle bir süre kullanmak için kötü bir uygulama mı? Belki de Kronometre kullanmak daha iyidir, ya da belki bu çözümün bazı tuzakları vardır? Uygulama C# zaman aşımı

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

    } 

ben bu yazıyı Implement C# Generic Timeout, gördüm ama basit senaryolarda kullanmak çok karmaşık - Eğer parçacığı eşitleme hakkında düşünmek gerekir, doğru benzeri şekillerde iptal ya da değil ve etmektir.

+3

Ne tam olarak bir zaman aşımı oluşturma ile yapmak istiyorsunuz? Bütün senaryonuzu anlatırsan, belki farklı bir yol kullanabiliriz. –

+0

İlgili/çoğaltın: http://stackoverflow.com/questions/3195030/thread-timeout-in-c – RQDQ

+0

Sadece bir süre sonra işi durdurmanız gerekiyor - işe başlayın, eğer 10 dakikadan fazla çalışırsa işi durdurun. Yöntemi çağıran iş parçacığı engellenebilir. – anderhil

cevap

15

Anladığım kadarıyla, yönteminizin bitene kadar veya belirli bir süre geçene kadar iş yapmasını istiyorsunuz? Bunun için bir Stopwatch kullanın ve bir döngü içinde geçen süreyi kontrol ediyorum:

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

Cevabınız için teşekkürler. Önce Kronometreyi düşündüm, sonra DateTime'ın daha basit olduğuna karar verdim, neden Stopwatch'un daha iyi olduğunu açıklayabilir misin? Ben DateTime dayalı uygulama olduğunu düşündüm ... – anderhil

+1

@anderhil: Bence Kronometre çok daha okunabilir :). DateTime.Now üzerindeki diğer bir avantaj ise, Kronometrenin * daha yüksek bir çözünürlüğe sahip olabileceğidir (sizin için sorun teşkil etmese de). –

+8

"DateTime" ı kullanmazdım çünkü tarihin altında değişebilir, Gün Işığından Tasarruf Zamanı gelir. Kodun çok uzun süre beklemesi (bir saat ve 10 dakika) veya kodun yeterince uzun süre beklememesine neden olabilir. Fakat 'Kronometre', saat kaç olursa olsun kaç dakika geçtiğini bilir. –

2

System.Timers.Timer sınıfının kullanılması daha iyidir.

+2

Zamanlayıcı bunun için uygun değil. –

+0

Evet, ama aradığım şey ...: D "Zaman aşımı" yanıltıcı olabilir, çünkü Javascript'in 'setTimeout() 'yöntemi aslında System.Timers.Timer'in C# içinde ne yaptığını yapar. –