【发布时间】:2012-01-30 14:03:28
【问题描述】:
我有一项服务可以打开多个观察者来观察多个文件夹。观看文件夹一段时间后,我得到“已达到网络 bios 命令限制”。
正如我在here 上所读到的,这是由于长期请求超出了允许范围。
我相信这是由于我有以下错误处理代码,这是由观察者错误事件触发的。这通过再次调用 WatchFile 方法来启动一个新的观察者实例。我相信这会使旧的现已失效的观察者继续运行并启动一个新的观察者,但我担心停止观察者会阻止它再次启动,或者会停止基于观察者的所有实例。
或者我错了,错误是否取决于更改的数量?这将导致 100 个文件同时放入,从而导致此错误。
每当我遇到此错误时,我都在考虑停止和启动服务,但这并不能解决问题本身,而只是隐藏它。有没有更好的解决办法?
private static void watcherError(String directory, Boolean intray, ErrorEventArgs e, FileSystemWatcher watcher)
{
Exception watchException = e.GetException();
EventLog.WriteEntry("WhiteFileMover", String.Concat("error gedetecteerd, watcher werd herstart - ", watchException.Message), EventLogEntryType.Information);
watcher = new FileSystemWatcher();
while (!watcher.EnableRaisingEvents)
{
try
{
// This will throw an error at the
// watcher.NotifyFilter line if it can't get the path.
WatchFile(directory, intray);
}
catch(Exception exp)
{
// Sleep for a bit; otherwise, it takes a bit of
// processor time
EventLog.WriteEntry("WhiteFileMover", String.Concat("Failed to restart watcher, retrying in 5 seconds - ", exp.Message), EventLogEntryType.Warning);
System.Threading.Thread.Sleep(5000);
}
}
}
【问题讨论】:
-
如何处置遇到错误的旧观察者?
-
@Kolja 如果我执行 watcher.dispose,那只会处理该实例或基于 watcher 的所有实例吗?例如,我创建了 3 个观察者实例,但只想处理其中一个。
-
它将释放变量指向的当前实例,也就是失败的实例。之后,您可以创建一个新实例。但是您不会丢弃它,而只是创建一个新的,这可能会导致一堆浪费的观察者实例。
-
安迪,我也有同样的问题。你能分享你的解决方案吗?我正在考虑在这里使用两种解决方案之一。使用目录轮询或编写 FSW 池来为相同的根目录返回一个对象。但是,我相信两者都会有自己的问题。此外,为 FSW 创建池而不是创建多个 FSW 只会延迟问题,但最终我会遇到网络 BIOS 错误,我必须重新开始观看。
标签: c# service .net-3.5 filesystemwatcher