8

Windows サービスを実行しています。この中で、数分ごとに関数を実行したいと考えています。いくつかのコードを見つけましたが、動作していないようですか? 私はロガーを持っていますが、timer_Elapsed 関数に入っていないようです。

 protected override void OnStart(string[] args)
    {
       // SmartImportService.WebService.WebServiceSoapClient test = new WebService.WebServiceSoapClient();
       // test.Import();
         log.Info("Info - Service Started");
        _timer = new Timer(10 * 60 * 1000); // every 10 minutes??
        _timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
    }

    private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        log.Info("Info - Check time");
        DateTime startAt = DateTime.Today.AddHours(9).AddMinutes(48);
        if (_lastRun < startAt && DateTime.Now >= startAt)
        {
            // stop the timer 
            _timer.Stop();               

            try
            {
                log.Info("Info - Import");
                SmartImportService.WebService.WebServiceSoapClient test = new WebService.WebServiceSoapClient();
                test.Import();
            }
            catch (Exception ex) {
                log.Error("This is my error - ", ex);
            }

            _lastRun = DateTime.Now;
            _timer.Start();
        }
    }
4

5 に答える 5

21

タイマーを開始する必要があります。

protected override void OnStart(string[] args)
{
     log.Info("Info - Service Started");
    _timer = new Timer(10 * 60 * 1000); // every 10 minutes
    _timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
    _timer.Start(); // <- important
}
于 2012-04-18T08:55:17.757 に答える
4

わかりません_timer.Start()、それはあなたの問題です。

于 2012-04-18T08:55:34.367 に答える
3

Daniel Higarthは正しいです。主な問題は、タイマーで Start を呼び出さないことです。

そうは言っても、タイマー付きのサービスの代わりに Windows タスク スケジューラの使用を検討することもできます。これにより、タスクを 10 分ごとに実行するようにスケジュールできますが、コンパイルを変更することなく、必要に応じてスケジュールを変更することもできます。

于 2012-04-18T09:05:56.687 に答える
3

この機能も必要です。つまり、私の C# Windows サービスは 10 分ごとに電子メールをチェックする必要があります。次のように、コードをより効果的にするためにいくつかのロジックを削除しました。

private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            _timer.Stop();
            try
            {
                EventLog.WriteEntry(Program.EventLogName, "Checking emails " + _count++);
            }
            catch (Exception ex)
            {
                EventLog.WriteEntry(Program.EventLogName, "This is my error " + ex.Message);
            }
            _timer.Start();
        }

実際、timer_elapsed メソッドは、最初の _timer.start() から開始して 10 分ごとに呼び出されます。_lastRun と startAt のチェックは行っていません。必要ないと思う

于 2013-01-23T10:08:01.853 に答える
1

を開始してみてくださいtimer

protected override void OnStart(string[] args)
    {
       // SmartImportService.WebService.WebServiceSoapClient test = new WebService.WebServiceSoapClient();
       // test.Import();
         log.Info("Info - Service Started");
        _timer = new Timer(10 * 60 * 1000); // every 10 minutes??
            _timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
_timer.Start();
    }

    private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        log.Info("Info - Check time");
        DateTime startAt = DateTime.Today.AddHours(9).AddMinutes(48);
        if (_lastRun < startAt && DateTime.Now >= startAt)
        {
            // stop the timer 
            _timer.Stop();               

            try
            {
                log.Info("Info - Import");
                SmartImportService.WebService.WebServiceSoapClient test = new WebService.WebServiceSoapClient();
                test.Import();
            }
            catch (Exception ex) {
                log.Error("This is my error - ", ex);
            }

            _lastRun = DateTime.Now;
            _timer.Start();
        }
    }
于 2012-04-18T08:56:58.187 に答える