2011-02-16 8 views
6

このようなwhileループを使用するのは悪い習慣ですか? ストップウォッチを使用する方が良いでしょうか、あるいはこの解決策にいくつかの落とし穴がありますか?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)); 

    } 

私はこの記事Implement C# Generic Timeout、 を見ましたが、簡単なシナリオで使用するにはあまりにも複雑である - あなたは、スレッドの同期を考える必要があり、それはそうでそれらを中止したりないとすることが適当です。

+3

何が正確にタイムアウトを作成してやりたいのですか?あなたがあなたの全体の風景を伝えるなら、おそらく我々は使用するために異なる方法を提供することができます。 –

+0

関連/複製:http://stackoverflow.com/questions/3195030/thread-timeout-in-c – RQDQ

+0

作業をやめて10分以上実行すると、作業を開始してから一定時間後に作業を停止する必要があります。メソッドを呼び出すスレッドをブロックすることができます。 – anderhil

答えて

15

私が理解しているように、あなたのメソッドは、完了するまで、または一定の時間が経過するまで、何らかの作業をしたいと思っていますか?私はそのためStopwatchを使用して、ループ内での経過時間を確認します:

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

答えをありがとう。私は最初にストップウォッチについて考えました、そして、私はDateTimeがより単純であると決めました、ストップウォッチがなぜ優れているのか説明できますか?私はそれがDateTimeに基づいて実装だと思った... – anderhil

+1

@anderhil:私はストップウォッチがはるかに読みやすく:) :) DateTime.Nowを超える唯一の利点はStopwatch *がもっと高い解像度を持つことができるということです(ただし問題はありません)。 –

+8

私は夏時間になると日付が変わるので、私は 'DateTime'を使用しません。コードが長時間(1時間10分)待つか、コードが十分長く待たされる可能性があります。しかし、「ストップウォッチ」は、何時になっても、何分経過したかを知っています。 –

2

System.Timers.Timerクラスを使用することをお勧めします。

+2

それはタイマーのためではありません。 –

+0

はい、しかし私が探していたもの:... D "タイムアウト"は、Javascriptの 'setTimeout()'メソッドが 'System.Timers.Timer'がC#で実際に行うことを実際に行うので誤解を招く可能性があります。 –

関連する問題