【发布时间】:2014-07-11 18:12:39
【问题描述】:
我在 Windows 2008 Server 上有一个基于 C#(.Net 框架 3.5)的 Windows 服务应用程序,它正在监视远程服务器/网络路径上的 22 个文件夹。时不时我会在日志中得到一个异常
System.ComponentModel.Win32Exception:已达到网络 BIOS 命令限制。
我尝试将InternalBufferSize 增加到 MAX (64K),但它对异常没有任何影响。
我将它定义为:
在班级级别:
FileSystemWatcher fsw;
在初始化方法中
fsw = new FileSystemWatcher("FolderUNC");
fsw.IncludeSubdirectories = false;
//m_fsw.InternalBufferSize = 65536; -- Commented out to default 8K
fsw.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.Size;
fsw.Renamed += new RenamedEventHandler(OnChanged);
fsw.Deleted += new FileSystemEventHandler(OnChanged);
fsw.Changed += new FileSystemEventHandler(OnChanged);
fsw.Created += new FileSystemEventHandler(OnChanged);
fsw.Error += new ErrorEventHandler(OnFileSystemWatcherError);
fsw.EnableRaisingEvents = true;
我还确保在出错或停止服务时处理 FileSystemWatcher 对象。喜欢
if (fsw != null)
fsw.Dispose();
我已尝试关注article KB-810886,但由于我的服务器是 Windows Server 2008,我没有MaxCmds、MaxMpxCT 等的注册表项。我已经查看了 Stackoverflow 上的相关问题,例如this one和this one,但他们似乎都没有解决这个问题。
感谢您提供解决问题的任何帮助或指导。
编辑:我还添加了一个类似的 question on ServerFaults ,关于如何在 Windows 2008 服务器上提高 MaxCMDs 的限制。
编辑 2:我在托管 Windows 服务的服务器上为 MaxCmds 和 MaxMpxCt 创建了密钥,并将它们的值设置为 250,但它没有任何效果。我关注了这篇文章。 http://alitarhini.wordpress.com/2011/04/06/299/
【问题讨论】:
-
FileSystemWatcher 是一种昂贵的操作系统资源。文件系统必须做很多工作才能生成这些通知。您的操作系统认为合理的南端。你当然不能通过调整不合理限制来解决这个问题,而是通过使用更少的观察者来解决它。
-
@HansPassant,感谢您的评论。我必须监视 22 个文件夹,并且将来可能会增加,我正在考虑将
FileSystemWatcher全部丢弃,并使用计时器在多个线程中定期监视所有目录。您认为这种方法会减少资源消耗吗? -
您将产生更多不必要的网络流量,这是另一种资源。只要您将计时器的间隔设置为合理的值,例如 10 分钟,那么这不是真正的问题。
-
@HansPassant,再次感谢,这对我来说是不行。你能告诉我如何提高限制吗?我是否必须增加我的服务器托管 Windows 服务的限制?或在具有要监视的文件夹的文件服务器上。再次感谢。
-
@HansPassant -- 你或我无法判断他应该多久投票一次或应该投票多少次。每种情况都是不同的,简单地用“资源太密集”来打消他的问题是没有帮助或有用的。此外 - 监视 22 个文件夹至少不是资源密集型的。 user2711965 - 您是否可以使用带有缓存的 .NET 4.5 来使用 hostfilewatcher? msdn.microsoft.com/en-us/library/…
标签: c# .net windows-services windows-server-2008 filesystemwatcher