2017-01-07 1 views
0

У меня есть очень простой сервисКак я могу понять, почему событие таймера в моей службе Windows не срабатывает?

using System.ServiceProcess; 
using System.Timers; 
using SystemTimer = System.Timers.Timer; 
using System.Net; 
using System.Data.SqlClient; 
using System; 

namespace ServiceThatConnectsToADb 
{ 
    public class LrcArchiver : ServiceBase 
    { 
     private static SystemTimer PageLoadTimer = new SystemTimer(5000); 

     public LrcArchiver() 
     { 
      ServiceName = "SO Archiver"; 
      CanStop = true; 
      CanPauseAndContinue = true; 
      AutoLog = true; 
      PageLoadTimer.Elapsed += new ElapsedEventHandler(WritePageToDb); 
     } 

     protected override void OnStart(string[] args) 
     { 
      EventLog.WriteEntry(ServiceName + " started"); 
     } 

     protected override void OnStop() 
     { 
      EventLog.WriteEntry(ServiceName + " stopped"); 
      PageLoadTimer.Enabled = false; 
     } 

     protected void WritePageToDb(object source, ElapsedEventArgs e) 
     { 
      try 
      { 
       string html; 
       using(WebClient client = new WebClient()) 
       { 
        html = client.DownloadString("http://stackoverflow.com"); 
       } 
       EventLog.WriteEntry("html = " + html.Substring(0, 100)); 
       using(SqlConnection connection = new SqlConnection("Data Source=DESKTOP-300NQR3\\SQLEXPRESS;Initial Catalog=SoArchive;Integrated Security=True")) 
       { 
        string nonQuery = $"INSERT INTO [dbo].[Homepage] ([Html]) VALUES ('{html}')"; 
        using(SqlCommand command = new SqlCommand(nonQuery, connection)) 
        { 
         bool succeeded = command.ExecuteNonQuery() == 1; 
         EventLog.WriteEntry(succeeded ? "Saved!" : "Not Saved"); 
        } 
       } 
      } 
      catch(Exception ex) 
      { 
       EventLog.WriteEntry("uh-oh! " + ex.Message); 
      } 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      ServiceBase.Run(new LrcArchiver()); 
     } 
    } 
} 

, который я установил и начал, но метод WritePageToDb не по всей видимости, стреляя, как ни один из его WriteEntry с показываете. Я вижу

SO Archiver начал

, но ничего после этого.

Любая идея, почему это так или как я могу отлаживать, чтобы найти причину?

ответ

3

Вы настраиваете его только на работу, но вы не запускаете таймер.

protected override void OnStart(string[] args) 
{ 
    PageLoadTimer.Enabled = true; 
    EventLog.WriteEntry(ServiceName + " started"); 
} 
-1

Попробуйте это, у меня была проблема в определенный момент времени, это работает для меня. Таймер устанавливается в течение 1 мин в данном примере.

TimerCallback callbacktimer; 
    Timer IntervalCheck; 


    protected override void OnStart(string[] args) { 

    try { 

    callbacktimer = new TimerCallback(SomeMethode); 
    IntervalCheck = new Timer(callbacktimer, null, TimeSpan.Zero, new TimeSpan(0, 1, 0)); 



    base.OnStart(args); 
    } catch (Exception ex) { 

    } 

    } 

    private void SomeMethode(object o) { 


    } 
Смежные вопросы