1

一定の間隔でアクションを実行する必要がある 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()
    }
}

また、メソッドを使用したWindowsサービスもありますOnStart

OnStartメソッドで type の新しいスレッドを開始する必要があることを理解していMailManagerClientます。

しかし、どうすればスレッドを開始できますか? 新しいスレッドのエントリ ポイントとなるべきメソッドはどれですか?

スレッドはどのように生き続ける必要がありますか?

4

3 に答える 3

1

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

于 2012-04-04T16:59:45.410 に答える
1

OnStart メソッドでは、次のことができます-

MailManagerClient m;
var th = new Thread(()=>m=new MailManagerClient());
th.Start();
于 2012-04-04T15:41:51.920 に答える
1

コンストラクターでタイマーを開始しているため、実際に必要なのは in をインスタンス化することだけMailManagerClientですOnStart。からスレッドでイベント ハンドラをSystem.Timers.Timer実行するため、手動でスレッドを作成する必要はありません。ElapsedThreadPool

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

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

}

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

于 2012-04-04T15:42:19.847 に答える