等待 FileSystemWatcher 正在监视目录

Waiting while FileSystemWatcher is monitoring directory

我正在尝试监视日志文件的更改。我的代码正在运行,并且做了它应该做的一切。但是,由于我希望将此 运行 作为 windows 服务并不断监控,因此我不确定将其设置为等待状态的正确方法。这是它目前正在做的事情。

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

            }
    }

然后就是一个简单的:

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

在 windows 服务中执行此操作的更好方法是什么?

您可以使用 WinForms 中的 Application.Run() 启动消息泵。

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

    }
}

参见 docs.microsoft.com 上的 Run(ApplicationContext)