2017-12-14 24 views
-1

VS 2015で初めてのC#サービスを開発しましたが、ElapsedEventHandlerメソッドを起動できません。私は、次のコードを持っている:データアップデータは私のログファイルに出力されますスタートVS 2015 C# - ElapsedEventHandlerがサービスで起動しない

using System; 
using System.ServiceProcess; 
using System.Timers; 

namespace UpdateEnvironmentService 
{ 
    public partial class Scheduler : ServiceBase 
    { 
     private Timer timer = null; 
     public Scheduler() 
     { 
      InitializeComponent(); 
     } 

     protected override void OnStart(string[] args) 
     { 
      timer = new Timer(); 
      this.timer.Interval = Convert.ToDouble(1000); //timer intraval in milliseconds 
      this.timer.Elapsed += new System.Timers.ElapsedEventHandler(this.UpdateData); 
      timer.Enabled = true; 
      Library.WriteLog("Data Updater Started "); 
     } 

     private void UpdateData(object sender, EventArgs e) 
     { 
      Library.WriteLog("Got to update Data "); 
     } 

     protected override void OnStop() 
     { 
      timer.Enabled = false; 
      timer = null; 
      Library.WriteLog("Data Updater Stopped "); 
     } 
    } 
} 

ラインを、私はデータを更新するためにガットを見終わることはありませんかさえは、Dataアップデータはを停止しました。私のElapsedEventHandlerは決して発射されないようです。誰にも何の理由がありますか?

答えて

0

System.Timers.Timerクラスのdocumentation on MSDNを参照します。

タイマーのほとんどの例と使用法は、Enabledを直接設定することを避け、代わりにStartStopの方法に依存します。サイドノートで

、私はあなたが別の方法で問題にアプローチすることを、Taskの時代にそれをお勧めします:

namespace UpdateEnvironmentService 
{ 
    public partial class Scheduler : ServiceBase 
    { 
     private readonly CancellationTokenSource _tcs; 
     public Scheduler() 
     { 
      InitializeComponent(); 
      _tcs = new CancellationTokenSource(); 
     } 

     protected override void OnStart(string[] args) 
     { 
      Library.WriteLog("Data Updater Started "); 
      Task.Factory.StartNew(Runner, _tcs.Token); 
     } 

     private async void Runner() 
     { 
      Library.WriteLog("In runner"); 
      var delay = TimeSpan.FromSeconds(1); 
      while(!_tcs.IsCancellationRequested) 
      { 
       Library.WriteLog("Waiting..."); 
       await Task.Delay(delay, _tcs.Token); 
       UpdateData(); 
      } 
      Library.WriteLog("Cancellation requested; exiting runner"); 
     } 

     private void UpdateData() 
     { 
      Library.WriteLog("Got to update Data "); 
     } 

     protected override void OnStop() 
     { 
      _tcs.Cancel(); 
      Library.WriteLog("Data Updater Stopped "); 
     } 
    } 
} 

をこのアプローチでは、タイマーの必要性を削除し、代わりに、非同期を紹介タスクから、スレッドプールが遅延を管理できるようにする。それはまた、それが遅延を待っている間にキャンセルすることができることを意味するより良いキャンセルコントロールを導入する利点があります!

関連する問題