再入嫌なら、タイマーイベントが発生したら、止めればいいだけなのでは?これはダメな発想ですね。タイマーイベントが発生してから止めるまでの間に、もう一度イベントが発生する可能性がありますから。サービスなので、System.Windows.Forms.Timerを使うのもよしたほうがよいでしょうね。無駄にメモリを喰うこともないでしょう。スレッドモデルとIOモデルで分類すると、一般に4つの選択肢があります。マルチスレッドで各スレッドが非同期IO最初のは普通ですね。ファイルアクセスは一般に遅いので、その間はスレッドが止まります。スループットは小さいですが、無駄な処理は一切ありません。いう意味では最も効率的です。2番目が理論上は最も高速にできます。PCをこのプロセスが占有してよいなら、最速です。管理する状態が増えてくるとプログラミングが大変になってきます。3番目は仕事を分けられるときの手法です。スレッド切り替えのコストがありますから、2よりは重くなります。同期機構をちゃんといれないとダメです。最後のはHTTPサーバーなどで使われる手で最も大変です。大規模なものではこれを使わないと開発が激しく大変になります。本来スレッドなど無くてもIO待ちのないプログラムが作れます。スレッドを使ったほうが開発が楽な場合のみ、使うべきです。具体的にどんな監視なのか分かりませんが、クライアントPCでフォルダ監視をするサービスなら、ユーザーが重く感じないように動いていて欲しいのではないでしょうか。あるなら、PCへの負荷が小さく、トータルで最も効率のよいシングルスレッド同期ファイルアクセスが最高であろうと思われます。速度が足りないときはファイルアクセスを非同期にして増やすのがいいでしょう。定期的に処理するのが一番楽で軽いですね。Sleepは重くないですし、それほどいい加減でもないので。System.Timers.Timerを使いたいなら、シングルスレッド化しないといけません。専用のワーカースレッドを用意し、Timerイベントからワーカースレッドへ、イベントを通知するのが普通かと思います。booleanを一個用意。Timerイベント先頭でInterlockedクラスを用いてinteger型をチェック。再入してるなら何もせずに帰る。再入してないなら監視タスクを実行。監視タスクが終わったら再入フラグをクリア。AutoResetEventを用意。TimerイベントではEventをセットするだけ。ワーカースレッドはEventを待つ。イベントが通知されたら監視タスクを実行。監視タスクが終わったらまたAutoResetEventを待つ。