系统相关
首页 > 系统相关> > 快速启动简单的C#FileSystemWatcher Windows服务

快速启动简单的C#FileSystemWatcher Windows服务

作者:互联网

我有一个Windows服务,我用C#编写.在幕后它是一个FileSystemWatcher. FSW会查找新文件并相应地处理它们.当我的服务启动时,它还需要处理现有文件.当我通过控制台应用程序执行此操作时,一切都按预期工作.

但是,当我尝试将这一切包装在Win服务中时,我的第一个问题是Win服务无法启动.它超时是因为,即使最初要处理的文件很多,处理也需要很长时间.

以下是我“观察”课程的部分代码:

public WatcherService()
{
    _log.Debug("WatcherService instantiated.");
    _watcher = new FileSystemWatcher { Path = AppConfig.MonitorFolder, IncludeSubdirectories = true };

    // we want the watching to start BEFORE we process existing files
    // because if we do it the other way, a file might get missed
    _watcher.Created += File_OnChanged;
}

public void StartWatching()
{
    _log.Debug("WatcherService started.");
    // this kicks off the watching
    _watcher.EnableRaisingEvents = true; 

    // process existing files
    ProcessExistingFiles(AppConfig.MonitorFolder);
}

我的解决方法是启动FSW“观察”并在单独的异步线程上处理初始文件,就像这样(在我的Windows服务代码中):

protected override void OnStart(string[] args)
{
    _log.Debug("LoggingService starting.");

    // kick off the watcher on another thread so that the OnStart() returns faster; 
    // otherwise it will hang if there are a lot of files that need to be processed immediately
    Task.Factory.StartNew(() => _watcher.StartWatching()).ContinueWith(t =>
        {
            if (t.Status == TaskStatus.Faulted)
            {
                _log.Error("Logging service failed to start.", t.Exception.InnerException ?? t.Exception);
            }
        });
}

如果我没有在Task.Factory.StartNew()中包装那个“StartWatching”方法,那么OnStart()会超时,这是可以理解的.但现在看来我的StartWat()方法永远不会被调用.我在日志中看到“LoggingService starting”,但没有“WatcherService started”. (编辑:仅供参考我也尝试过Task.Run(),但无济于事.)

怎么了?我确信我要么不明白StartNew()正在做什么和/或有更好的做我想要完成的事情.

思考?

谢谢!

解决方法:

你可以完全避免线程化.只需在OnStart()方法中进行基本设置即可.部分设置是设置一个计时器在一两秒钟内完成.该计时器可以在当前线程上运行,但是在服务空闲后会发生.

这将解决问题,编写线程安全代码更容易.

标签:c,filesystemwatcher
来源: https://codeday.me/bug/20190629/1321696.html