2012-04-18 21 views
6

Tôi có một dịch vụ windows đang chạy, bên trong này tôi muốn chạy một hàm sau đó mỗi phút. Tôi đã tìm thấy một số mã nhưng nó dường như không hoạt động? Tôi có một logger và nó dường như không đi vào chức năng timer_Elapsed bao giờ?làm thế nào để có một chức năng chạy bên trong một dịch vụ mỗi 10 phút?

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(); 
     } 
    } 
+1

Bạn có cần phải gọi bắt đầu trên Bộ hẹn giờ không? –

+0

xem http://stackoverflow.com/questions/246697/windows-service-and-timer –

+0

ahhh yeeeeeeeee – Beginner

Trả lời

16

Bạn cần phải bắt đầu hẹn giờ:

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 
} 
+4

Trong 10 phút, tôi thích sử dụng 'TimeSpan.FromMinutes (10) .TotalMilliseconds;' thay vì '10 * 60 * 1000' – Jaider

3

Tôi không thấy _timer.Start(), mà nên là vấn đề của bạn.

1

Hãy thử bắt đầu 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(); 
     } 
    } 
2

Daniel Hilgarth là đúng - vấn đề chính là bạn không bao giờ gọi Start trên bộ đếm thời gian.

Điều đó đang được nói, bạn có thể cũng muốn xem xét sử dụng Windows Task Scheduler thay vì một dịch vụ với bộ hẹn giờ. Điều này cho phép bạn lên lịch nhiệm vụ chạy 10 phút một lần, nhưng cũng thay đổi lịch trình bất cứ khi nào bạn muốn mà không cần thay đổi biên dịch.

3

Tôi cũng cần chức năng này. Nghĩa là dịch vụ C# windows của tôi phải kiểm tra email sau mỗi 10 phút. Tôi rút gọn một số logic để làm cho mã hiệu quả hơn, như sau:

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

Phương pháp timer_elapsed thực sự sẽ được gọi mỗi 10 phút, bắt đầu từ _timer.start đầu tiên(), mà bạn bỏ lỡ nó bằng cách này . Tôi đã không thực hiện bất kỳ kiểm tra của _lastRun và startAt. Tôi không nghĩ rằng chúng tôi cần nó

Các vấn đề liên quan