FileSystemWatcher是否需要消息泵?

时间:2018-04-03 16:44:47

标签: c# filesystemwatcher

我正在使用基于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永远不会从操作系统接收事件吗?如果没有,我如何找出造成这种情况失败的原因?

1 个答案:

答案 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;