2017-12-14 3 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 "); 
     } 
    } 
} 

라인을,하지만 난 데이터를 업데이트 있어보고 결국 결코 또는 이 데이터 업데이을 중단했다. 내 ElapsedEventHandler가 절대 실행되지 않는 것 같습니다. 왜 아무 생각 없어?

답변

0

System.Timers.Timer 클래스는 documentation on MSDN입니다.

타이머의 대부분의 예제와 사용법은 Enabled을 직접 설정하는 것을 피하고 대신 StartStop 메서드를 사용합니다. 이러한 접근 방식은 타이머에 대한 필요성을 제거

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 "); 
     } 
    } 
} 

, 대신 비동기 소개 : 사이드 노트에

, 난 당신이 다른 방법으로 문제를 접근하는 것이, Task의 나이에 그에게 추천 할 것 스레드 풀이 지연을 관리하도록 허용; 또한 지연을 기다리는 동안 취소 할 수 있다는 것을 의미하는 더 좋은 취소 제어 기능을 도입하는 이점도 있습니다!