56

10分ごとに実行されるタイマーがあるとします。その処理のサイクルに 10 分以上かかる場合はどうでしょうか。そのための新しいスレッドが開始されますか?現在の操作を中断しますか? タイマー内で単一のオブジェクトが変更された場合はどうなりますか?

問題が明確であり、サンプルアプリケーションを介してテストして大まかな答えを見つけるのではなく、マルチスレッドプログラミングオタクの観点から完全な答えを知りたいため、そのコードについて言及していない場合は申し訳ありません。実は、その動作メカニズムの背後にあるロジックを知りたいです。

4

3 に答える 3

58

System.Threading.Timerまたはを使用している場合System.Timers.Timer、タイマーは再びティックし、新しいスレッドを開始します。この問題を回避する方法については、https://stackoverflow.com/a/10442117/56778を参照してください。

を使用している場合System.Windows.Forms.Timer、前のティックの処理が完了するまで、新しいティックは発生しません。

于 2012-05-06T14:38:06.977 に答える
3

コードをMonitor.TryEnter()

object timeCheck= new object();

void Timer()
{
    Monitor.TryEnter(timeCheck) 
    {
        //Code that might take too long 
        //...
        Monitor.Exit();
    }
}
于 2012-05-06T21:21:29.397 に答える
1

再入を防ぐために、関数がすでに実行されているかどうかを示す静的ブール値を使用できます。try/Catch/finally を使用し、finally でこのブール値を false に設定して、コードを間違えた場合やコードが失敗した場合にブール値が false のままにならないようにします。
タイマーを高速化するには、セマフォ (ミューテックス) を使用して再入可能性を防止する必要があります。

于 2012-05-06T14:58:47.217 に答える