【问题标题】:Make data available to FileSystemWatcher Event Handler使数据可用于 FileSystemWatcher 事件处理程序
【发布时间】:2013-04-11 01:58:12
【问题描述】:

我的 C# 5.0 应用程序涉及在多个不同目录上使用 FileSystemWatcher

此应用程序包含List<> 对象。每个对象都描述了被监视的目录,以及需要由FileSystemWatcher 事件处理程序访问的许多其他数据。这些对象的类型为CustomDirectorySetting

这是一个服务器应用程序,我希望FileSystemWatcher 的事件处理程序会经常被调用。我必须确保他们能够跟上他们的工作,并且不会落后于对文件更改事件的响应。值得补充的是,被监控的目录对于运行应用程序的机器来说是本地的。

如何使FileSystemWatcherCustomDirectorySetting 对象快速可用于每个FileSystemWatcher 的事件处理程序,我是否应该考虑使用任务并行库来实现此实现?我是 TPL 的新手,非常感谢您对哪些方面最合适的想法。

【问题讨论】:

  • 什么是 CustomDirectorySetting 对象?
  • @Blam - 很抱歉造成混淆 - 我应该解释说它是特定于应用程序的自定义类型。它不是 BCL 的一部分。

标签: c# .net task-parallel-library filesystemwatcher


【解决方案1】:

由于 FileSystemWatcher 似乎可用作基类,因此您可以从中派生自己的类并添加 CustomDirectorySetting 类型的属性。

【讨论】:

  • 我没想过要试试这个。我一定会试一试的。
【解决方案2】:

与 nvoigt 所说的相反,我认为创建一个派生自 FileSystemWatcher 的类型太过分了。

更好的选择是在您的CustomDirectorySetting 类型上使用事件处理程序,这意味着它将能够通过this 访问您需要的数据。

class CustomDirectorySetting
{
    public string Directory { get; set; }

    public void OnChanged(object sender, FileSystemEventArgs e)
    {
        // your code here
    }
}

…

List<CustomDirectorySetting> list = …;
foreach (var setting in list)
{
    var fsw = new FileSystemWatcher(setting.Directory);
    fsw.Changed += setting.OnChanged;
    fsw.EnableRaisingEvents = true;
}

另一种选择是使用 lambda:

private static void OnChanged(
    CustomDirectorySetting setting, FileSystemEventArgs eventArgs)
{
    // your code here
}

…

foreach (var setting in list)
{
    var fsw = new FileSystemWatcher(setting.Directory);
    CustomDirectorySetting settingCopy = setting;
    fsw.Changed += (sender, eventArgs) => OnChanged(settingCopy, eventArgs);
    fsw.EnableRaisingEvents = true;
}

在这种情况下,最好不要直接在 lambda 中使用循环变量,因为它在旧版本的 C# 中无法正常工作。

【讨论】:

  • 这看起来是一个非常有趣的问题解决方案。我的一个问题是,当 FileSystemWatcher 在 foreach 循环的每次迭代中超出范围时,它是否会继续正常工作。我的印象是它必须持续存在才能正常运行。或者也许一旦设置了事件处理程序就可以将其关闭?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多