快速启动简单的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