2012-04-04 19 views
1

一定の間隔でアクションを実行するWindowsサービス内でスリープの代わりにタイマーを使用したいと思います。Windowsサービス内のタイマーを使用する

私は次のクラスがあると言います。

class MailManagerClient 
{ 

    //fields 
    string someString 

    //Constructor 
    public MailManagerClient() 
    { 
      aTimer = new System.Timers.Timer(30000); 
      aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
      aTimer.Enabled = true 
    } 
    //methode 

    public bool DoSomthingIncConstantInterval() 
    { 
     //Do Somthing 
     return true; 
    } 


    private static void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     DoSomthingIncConstantInterval() 
    } 
} 

そして私もOnStart方法でWindowsサービスを持っています。

OnStartメソッドでは、タイプMailManagerClientの新しいスレッドを開始する必要があります。

スレッドをどのように開始すればよいですか?どちらのメソッドを新しいスレッドのエントリポイントにする必要がありますか?

スレッドはどのように生き残るべきですか?

MailManagerClient m; 
var th = new Thread(()=>m=new MailManagerClient()); 
th.Start(); 
+0

多分あなたはquartz.netを見ておくべきでしょう、私はあなたの目的をはるかに良くするだろうと思っています。 – alxbrd

+0

[System.Reactive.Linq](http://msdn.microsoft.com/en-us/library/hh229435(v=103).aspx)のObservable.Timerも同様に検討する必要があります。 –

答えて

1

を使用すると、コンストラクタでタイマーを起動しているので、あなたが本当にする必要があるすべてはOnStartMailManagerClientをインスタンス化するよりも - あなたが持っている可能性のOnStartメソッドで

1

System.Timers.TimerThreadPoolのスレッドでElapsedイベントハンドラを実行するため、手動でスレッドを作成する必要はありません。

public class MyService : ServiceBase 
{ 
    private MailManagerClient mmc = null; 

    protected void OnStart(string[] args) 
    { 
    mmc = new MailManagerClient(); 
    } 

} 

私はそれがMailManagerClient.ctorは実際には何をやっていることをあなたのコードを見て次のプログラマには明らかではないことを指摘しなければなりません。 Startメソッドなどを定義して内部タイマーを有効にする方がよいでしょう。

1

また、このSO答えで説明されているように、Windowsタスクの定義を検討することもできます。What is the Windows version of cron? Windows OSはスケジューリングとスレッディングを処理します。

関連する問題