2009-07-09 31 views
2

Windowsサービスを使用して、30秒ごとにタスクを実行する必要がある場合は使用する方が良いです。 Timer()クラスまたはタスクを実行するループが数秒間スリープしますか?Windowsサービスのスケジュール実行

class MessageReceiver 
{ 
    public MessageReceiver() 
    { 
    } 

    public void CommencePolling() 
    { 
     while (true) 
     { 
      try 
      { 
       this.ExecuteTask();  
       System.Threading.Thread.Sleep(30000); 
      } 
      catch (Exception) 
      { 
       // log the exception 
      } 
     } 
    } 

    public void ExecutedTask() 
    { 
     // do stuff 
    } 
} 

class MessageReceiver 
{ 
    public MessageReceiver() 
    { 
    } 

    public void CommencePolling() 
    { 
     var timer = new Timer() 
      { 
       AutoReset = true, 
       Interval = 30000, 
       Enabled = true 
      }; 

     timer.Elapsed += Timer_Tick;  
    } 

    public void Timer_Tick(object sender, ElapsedEventArgs args) 
    { 
     try 
     { 
      // do stuff 
     } 
     catch (Exception) 
     { 
      // log the exception 
     } 
    } 
} 

WindowsサービスがMessageRecieverクラスのインスタンスを作成し、新しいスレッドでCommencePollingメソッドを実行します。

+2

http://stackoverflow.com/questions/1099516/for-a-windows-serviceの複製のようですそれは「サービスタイマー」を検索することで見つけた、より良い待っている、つまりスピンまたはタイマーです。 –

+0

@Johnありがとう。私は "Windowsサービスタイマー"を検索しようとしましたが、何も見つかりませんでした。乾杯 – Kane

答えて

4

を見つけることができる私はそれが本当にあなたの条件に依存だと思います。

場合1. は、例えば(あなたは午前12時から始まるthis.ExecuteTask() 5分ごとに(すなわち、12時00分、12時05分に、...)を実行し、this.ExecuteTask()の実行時間が変化すると仮定するとします、30秒から2分に)、多分Thread.Sleep()の代わりにタイマーを使用する方が簡単です(少なくとも私にとって)。

しかし、Thread.Sleep()でこの現象を達成するには、スレッドウェイクアップ時と完了時にタイムスタンプを取ってオフセットを計算します。this.ExecuteTask()。 2.

場合はThread.Sleep()が簡単であるように思わ使用して、あなただけのthis.ExecuteTask()の完了後に、次の5分でタスクを実行するとします。繰り返しますが、毎回タイマーをリセットすることで、この動作をタイマーで達成することもできます。this.ExecuteTask()が完了するたびにオフセットを計算します。

注1は、ケース1のために、あなたは次のシナリオで非常に注意しなければならない:this.ExecuteTask()は時々時間以上かかる場合はどう(すなわち、それは12時05から始まり、上記の例では12時13分に完了します) 。

  1. これはアプリケーションにとってどのような意味を持ち、どのように処理されるのですか?

    a。 Total failure - サービスを中止するか、現在の(12:05)実行を12:10に中止し、12:10の実行を開始します。
    b。大したことではありません(12:10をスキップし、12:15にthis.ExecuteTask()を実行してください)。

    c。大したことではありませんが、12:05のタスクが終了した直後に12:10の実行を開始する必要があります(5分以上かかる場合はどうなりますか?)。

    d。 12:05の実行が現在実行中であっても12:10の実行を開始する必要があります。

    e。他に何か?

  2. 上記のポリシーについては、お客様のポリシー(タイマーまたはThread.Sleep()のいずれか)を選択してポリシーを簡単にサポートできますか?注2

。 .NETで使用できるタイマーがいくつかあります。次の文書を参照してください(少し古くなっていますが、それは良いスタートです)。Comparing the Timer Classes in the .NET Framework Class Library

0

10秒間待機していますか? Thread.sleepを使用するとブロックされ、他のことができなくなります。パフォーマンスの観点からは、あまりにも多くの違いがあるとは思えませんが、自分でThread.sleepを使用することは避けています。

選択できるタイマーは3つあります。System.Windows.Forms.Timerはメインスレッドで実装されていますが、System.Timers.TimerとSystem.Threading.Timerは別々のスレッドを作成しています。

0

私は両方の方法が同等であると信じています。スレッドを作成するか、Timerクラスを実装しているライブラリによって作成されるかのどちらかの方法でスレッドが作成されます。

タイマーを実装するスレッドはおそらく他のタイムアウトも監視しているため、Timerクラスを使用するほうがリソースの方がやや安くなる可能性があります。

関連する問題