1

x 分ごとに何らかのメソッドを実行する Windows サービスを作成していますが、メソッドをタイマー自体に対して同期的に実行したいと考えています。Windows サービスには Timer オブジェクト (System.Timers.Timer) があり、x 分ごとにメソッド「DoWork」を開始して呼び出しますが、タイマーは「DoWork」の実行中に「停止」し、メソッドが終了した後に再び開始する必要があります。

System.Windows.Forms.Timer クラスを使用すると、必要な動作が得られることはわかっていますが、Service プロジェクトに System.Windows.Forms dll 参照を追加したくありません。

これは「動作する」コードの例です:

    private System.Timers.Timer timer1;

    public void MainMethod()
    {
        timer1 = new System.Timers.Timer();
        timer1.Interval = 1000;
        timer1.Elapsed += new ElapsedEventHandler(timer1_Elapsed);
        timer1.Start();
    }

    void timer1_Elapsed(object sender, ElapsedEventArgs e)
    {
        timer1.Stop();
        DoWork();
        timer1.Start();
    }

    private void DoWork()
    {
        Thread.Sleep(2000);
        Console.WriteLine("found!");
    }

コンソール アプリケーションで上記を実行すると (Windows サービスを作成する前のモックアップとして)、期待される動作は、コンソールが 'found!' を書き込むことです。3秒ごと。

余談ですが、「Thread.Sleep(2000)」を使用して遅延を模倣しているだけですが、実際のコード ベースの一部にはなりません。

上記の方法よりもこれを達成するための他の/「より良い」方法はありますか?

私の質問を読んでくれてありがとう。

4

3 に答える 3

3

System.Forms.Timerメッセージポンプが必要であり、Windowsサービスには非常に大きなメッセージポンプスタックが与えられていないため、Windowsサービスで使用することはできません(さらにApplication.Run、開始するには呼び出す必要があります)。

あなたが今それを持っている方法は、私が定期的なイベントを実装する方法です。イベントに期間よりも時間がかかるかどうかを監視するために何かを追加します。でもそれ以外は...

于 2012-09-04T14:38:55.797 に答える
0

メソッドの呼び出し間のX秒の遅延を一定にするか、メソッドをX秒ごとに呼び出すかによって異なりますが、メソッドにX秒より長くかかる場合は余裕があります。実行する。

上記のコードは前者を実行します。メソッド呼び出しの間に1秒の遅延がありますが、メソッドをX秒ごとに呼び出す場合は、タイムスタンプの使用を検討しDateTime.NowDateTime.Subtract適切な時間が経過したかどうかを確認することをお勧めします。最後のメソッド呼び出し。これにより、システムクロックが変更された場合、たとえば夏時間でメソッドが1時間実行されない場合など、異常な動作が発生する可能性がありますが、この異常な動作は、状況に応じて許容できると見なされる場合があります。

于 2012-09-04T15:07:58.423 に答える
-1

あなたが抱えている主な問題は、「「DoWork」の実行中にタイマーを「停止」し、メソッドの終了後に再び開始する必要がある」と説明されているようです。要するに、サービスはマルチスレッドである必要があります。スレッド プールの使用を検討する必要があります。スレッド プールを使用すると、実行中のスレッドが時間のカウントを継続し、バックグラウンド スレッドが他の作業を行うことができます。http://msdn.microsoft.com/en-us/library/3dasc8as%28v=vs.80%29.aspxの ThreadPool ドキュメントを確認してください。

于 2012-09-04T14:41:38.293 に答える