使数据可用于FileSystemWatcher事件处理程序

时间:2013-04-10 13:41:49

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

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

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

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

如何快速将FileSystemWatcher的{​​{1}}对象提供给每个CustomDirectorySetting的事件处理程序,我是否应该考虑使用任务并行库来实现此实现?我是TPL的新手,所以我很感激你对哪些方面最合适的想法。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

与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#中无法正常工作。