2017-10-25 1 views
-1

Ich versuche, eine Protokolldatei auf Änderungen zu überwachen. Mein Code funktioniert und tut alles, was er sollte. Da ich möchte, dass dies als Windows-Dienst läuft und ständig überwacht wird, bin ich mir nicht sicher, wie ich es in einen Wartezustand versetzen könnte. Hier ist, was es gerade macht.Wartet, während FileSystemWatcher das Verzeichnis überwacht

public static void Main() 
    { 
      log_watcher = new FileSystemWatcher(); 
      log_watcher.Path = Path.GetDirectoryName(pathToFile); 
      log_watcher.Filter = recent_file.Name; 
      log_watcher.NotifyFilter = NotifyFilters.LastWrite; 
      log_watcher.Changed += new FileSystemEventHandler(OnChanged); 

      log_watcher.EnableRaisingEvents = true; 
      //do rest of stuff OnChanged 
      while (true) 
      { 

      } 
    } 

Und dann nur eine einfache:

public static void OnChanged(object sender, FileSystemEventArgs e) 
    { 
     Console.WriteLine("File has changed"); 
    } 

Was wäre eine bessere Art und Weise in einem Windows-Dienst sein, dies zu tun?

+0

Das ist kein Windows-Service-Code, nur eine Konsolen-App. Erstellen Sie zuerst das richtige Beispiel, wo Sie eine Nachrichtenpumpe haben (wie einen Winforms-Code), die auf "Start", "Stopp" usw. reagiert. –

+0

@LB versucht, sicherzustellen, dass mein Code funktioniert, bevor ich ihn in einen Dienst lege, weil es einfacher ist debug imo – Tom

+0

Aber eine Konsole App ist nicht der richtige Weg, um zu testen. Verwenden Sie mindestens eine Winforms App –

Antwort

0

Sie können eine Nachrichtenpumpe mit Application.Run() von WinForms starten.

using System.Windows.Forms; 
// The class that handles the creation of the application windows 
class MyApplicationContext : ApplicationContext { 

    private MyApplicationContext() { 
     // Handle the ApplicationExit event to know when the application is exiting. 
     Application.ApplicationExit += new EventHandler(this.OnApplicationExit); 

     log_watcher = new FileSystemWatcher(); 
     log_watcher.Path = Path.GetDirectoryName(pathToFile); 
     log_watcher.Filter = recent_file.Name; 
     log_watcher.NotifyFilter = NotifyFilters.LastWrite; 
     log_watcher.Changed += new FileSystemEventHandler(OnChanged); 

     log_watcher.EnableRaisingEvents = true; 
    } 

    public static void OnChanged(object sender, FileSystemEventArgs e) { 
     Console.WriteLine("File has changed"); 
    } 

    private void OnApplicationExit(object sender, EventArgs e) { 
     Console.WriteLine("File monitor exited."); 
    } 

    [STAThread] 
    static void Main(string[] args) { 

     // Create the MyApplicationContext, that derives from  ApplicationContext, 
     // that manages when the application should exit. 

     MyApplicationContext context = new MyApplicationContext(); 

     // Run the application with the specific context. It will exit when 
     // all forms are closed. 
     Application.Run(context); 

    } 
} 

Siehe Run(ApplicationContext) auf docs.microsoft.com.

Verwandte Themen