2012-03-31 24 views
1

私は、.Net 4.0 C#Windowsサービスを使用して、連続して実行されるいくつかのスレッドを生成します。各スレッドは、タイマーに基づいて異なる間隔で実行されます。Windowsサービスでタイマーを待っているスレッドをシャットダウンします。

サービスがシャットダウンされたときに、これらのスレッドを正常にシャットダウンする必要があります。

これらのスレッドの中には処理に何時間も待っている可能性があるため、それらをスリープ解除して終了するように指示する必要があります。

これらのスレッドでループを作成して、グローバル変数を定期的にチェックすることができますが、処理間隔よりも少し時間がかかりますが、タイマーが早すぎてポップするようなシグナルメカニズムが好まれます。

Thread.AbortまたはThread.Interruptを使用せずに、これらのスレッドをタイマーで待機させるにはどうすればよいですか?

+0

ワーキングスレッドをラッチするためにタイマーを使用するのではなく、作業を行うために 'Timer'を使用するだけの特別な理由は何ですか? –

+2

スレッドはあまりにも高価すぎるシステムオブジェクトは何も役に立たずに何時間も待っています。 Timerクラスからスレッドを無料で入手できます。 –

+0

これは現在、さまざまな種類の処理用にスレッドを持っている既存のサービスです。現在はThread.Abort()とSleepを使用しています。 Timerとそれが代わりに生成するスレッドを使用して調べます。 – codezoo

答えて

2

独立して管理されたスレッドを使用して(タイマーのイベントで行うのではなく)作業を行う理由があると仮定します。もしそうなら、あなたはWaitHandleを続行するスレッドを引き起こしたかを決定するためにWaitHandle.WaitAny()を使用して、戻り値を調べたい:

public class ExampleService 
{ 
    private static readonly AutoResetEvent TimerLatch = new AutoResetEvent(false); 
    private static readonly AutoResetEvent ShutdownLatch = new AutoResetEvent(false); 
    private static readonly Timer MyTimer = new Timer(TimerTick); 

    public void Start() 
    { 
     var t = new Thread(DoLoop); 
     t.Start(); 

     MyTimer.Change(0, 500); 
    } 

    public void Stop() 
    { 
     ShutdownLatch.Set(); 
    } 

    private static void TimerTick(object state) 
    { 
     TimerLatch.Set(); 
    } 

    private static void DoLoop() 
    { 
     if (WaitHandle.WaitAny(new[] { TimerLatch, ShutdownLatch }) == 0) 
     { 
      // The timer ticked, do something timer related 
     } 
     else 
     { 
      // We are shutting down, do whatever cleanup you need 
     } 
    } 
} 
+0

これは完璧です。ありがとう。 – codezoo

2

あなたはタイムアウトでWaitHandle.Waitoneを使用して、に応じて、イベント

if (shutDownEvent.WaitOne(_timeout, false)) 
{ 
    //Shutdown 
} 
else 
{ 
    //timeout so Dowork 
} 
0

を使用することができますシナリオでは、バックグラウンドスレッドを生成するスレッドを作成して、明示的にシャットダウンする心配がありません。

Thread thread = new Thread(DoSomething) 
{ 
     IsBackground = true 
}; 

終了からあなたのサービスを停止しません、バックグラウンドスレッドをスレッド生み出しtrueにIsBackgroundを作る設定。 MSDNから

スレッドがバックグラウンドスレッドまたはフォアグラウンドスレッドのいずれかです。 バックグラウンドスレッドは、バックグラウンドスレッド がプロセスの終了を妨げることを除いて、フォアグランドスレッドと同じです。プロセスに属するすべての フォアグラウンドスレッドが終了すると、共通の ランタイムがプロセスを終了します。残りのバックグラウンドスレッド は停止され、完了しません。

これはもちろん、実行している操作が中断され、正常にシャットダウンする必要がない場合(例:クリティカルなクリーンアップ作業を行う場合)のみです。そうでない場合は、他の答えとして、WaitHandleを使用し、メインスレッドからの信号を使用してください。

関連する問題