2017-01-07 3 views
0

Ich habe einen sehr einfachen ServiceWie kann ich herausfinden, warum das Timer-Ereignis in meinem Windows-Dienst nicht ausgelöst wird?

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

, die ich installiert habe und gestartet, aber die WritePageToDb Methode erscheint nicht als keiner seiner WriteEntry s zu feuern zeigen. Ich sehe

SO Archiver

aber nichts danach gestartet.

Irgendeine Idee, warum das ist oder wie ich debuggen kann, um die Ursache zu finden?

Antwort

3

Sie setzen es nur auf Arbeit, aber Sie starten den Timer nicht.

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

Versuchen Sie dies, ich hatte ein Problem zu einem bestimmten Zeitpunkt, das funktioniert für mich. Der Timer wird für 1 Minute in diesem Teilbeispiel

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) { 


    } 
eingestellt
Verwandte Themen