我想要做的是创建一个文件监视器,监视我的服务配置文件中的任何更改。当它检测到任何更改时,服务应自动重新启动,以便可以获取更改。但是,我很难让文件观察者注意到已经进行了任何更改。
这是我的观察员代码:
private void WatchConfigurationFile(string path)
{
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = path;
watcher.NotifyFilter = NotifyFilters.LastWrite;
watcher.Filter = "Project.MyService.exe.config"; // name of the file I'm wanting to watch
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
}
然后是OnChanged方法:
private void OnChanged(object source, FileSystemEventArgs e)
{
Log.Info("A change in the config has been found. Stopping Service");
ServiceController service = new ServiceController("MyService");
try
{
TimeSpan timeout = TimeSpan.FromMilliseconds(20);
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
}
catch(Exception ex)
{
// ...
Log.Error("Error restarting service: " + ex.Message);
}
}
最后,我通过以下呼叫呼叫以上所有内容:
public void Run()
{
WatchConfigurationFile("..\\InstallFolder\\MyService\\");
}
Run
方法已在我的服务中使用。我让服务在一个计时器上运行,在每次倒计时结束时调用Run
。此方法已经有其他方法调用,所以我知道Run
方法正在运行。
我做错了什么?我有一种有趣的感觉,我的路径可能不正确,因为配置与服务本身位于同一位置。但如果其他人能够阐明这一点,我们将不胜感激。