【问题标题】:c# service "The netwerk bios command limit has been reached" error why and whats the best solution?c# service "The netwerk bios command limit has been reached" 错误为什么以及最好的解决方案是什么?
【发布时间】: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


【解决方案1】:

看看这一行:

watcher = new FileSystemWatcher();

您传入了一个 FileSystemWatcher 变量,但完全忽略了传递的值。相反,您创建了一个新实例。不仅如此,您还未能正确处置实例。我的猜测是你有一堆旧的 FileSystemWatcher 对象在等待收集。它们中的每一个都将保留来自操作系统的一些真实文件系统资源。随着时间的推移,您会用完可用的文件句柄。

【讨论】:

  • 我在创建新的观察者之前添加了一个 watcher.dispose,但错误仍然存​​在。在从内存中删除旧的观察者之前,我还需要做些什么吗?
  • @Andy Dispose() 与内存无关。值得庆幸的是,内存不是您的问题(文件句柄是)。但真正的问题是你不应该一直创建一个新的观察者。您想为您的应用使用恰好一个观察者,并传递对该实例的引用。
【解决方案2】:

为什么不创建文件观察器并定义事件处理程序?

http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    相关资源
    最近更新 更多