10分ごとに実行されるタイマーがあるとします。処理のサイクルに10分以上かかる場合はどうなりますか。そのために新しいスレッドが開始されますか?現在の操作を中断しますか?タイマー内で単一のオブジェクトが変化した場合はどうなりますか?
問題が明確であり、サンプルアプリケーションを使用してテストすることで緩い答えを見つけるのではなく、マルチスレッドプログラミングオタクの観点から完全な答えを知りたいので、そのためのコードに言及しない場合は申し訳ありません。実際、その動作メカニズムの背後にあるロジックを知りたいです。
System.Threading.Timer
またはSystem.Timers.Timer
を使用している場合、タイマーは再びカチカチ音をたて、新しいスレッドを開始します。この問題を回避する方法については、 https://stackoverflow.com/a/10442117/56778 を参照してください。
System.Windows.Forms.Timer
を使用している場合、前のティックの処理が完了するまで新しいティックは発生しません。
コードをMonitor.TryEnter()
に入れます
object timeCheck= new object();
void Timer()
{
Monitor.TryEnter(timeCheck)
{
//Code that might take too long
//...
Monitor.Exit();
}
}
再入を防ぐために、関数が既に実行されているかどうかを示す静的ブール値を使用できます。 try/Catch/finallyを使用し、finallyでこのブール値をfalseに設定して、コードを間違えた場合やコードが失敗した場合にブール値がfalseのままにならないようにします。
タイマーを高速化するには、セマフォ(mutex)を使用して再入を防止する必要があります。