我正在使用基于HttpListener
的自定义服务器。它运行得相当好,直到我尝试使用FileSystemWatcher
使其能够响应更改的脚本内容而无需重新启动服务器。它似乎永远无法发射。
相关代码如下所示:
foreach (var script in Directory.EnumerateFiles(folder, mask))
{
var filename = Path.GetFileNameWithoutExtension(script);
var compileResult = scriptCompiler.CompileScript(script);
if (compileResult.Errors.Count > 0)
throw new Exception(compileResult.Errors.ToString());
AddScriptType(compileResult.GeneratedAssembly.GetType(filename));
}
this._watcher = new FileSystemWatcher(folder, mask);
_watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
var changed = (s, e) => RebuildScript(scriptCompiler, e);
_watcher.Changed += changed;
_watcher.Created += changed;
_watcher.Deleted += this.ScriptDeleted;
_watcher.EnableRaisingEvents = true;
这看起来非常简单,但如果我进入并更改其中一个脚本文件,RebuildScript
永远不会被调用。
我无法帮助,但想知道HttpListener
是否干扰了使其正常工作所需的某些消息传递架构。服务器在主线程上运行,在无限循环中等待HTTP请求,处理它并返回响应。这会导致FileSystemWatcher
永远不会从操作系统接收事件吗?如果没有,我如何找出造成这种情况失败的原因?
答案 0 :(得分:0)
正如评论中提到的@HansPassant一样,为NotifyFilter设置的选项会阻止事件被触发。
根据https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.notifyfilter(v=vs.110).aspx ,“[t]默认是LastWrite,FileName和DirectoryName的按位OR组合。”
本文讨论选择适当的FileSystemWatcher过滤器以实现您的目标。
Which filter of FileSystemWatcher do I need to use for finding new files。正如@DavidBrabant在本文的答案中提到的,我建议设置_watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName;