1

我有 C# 5.0 应用程序,其中涉及FileSystemWatcher在多个不同目录上使用 a 。

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

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

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

4

2 回答 2

0

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

于 2013-04-10T15:57:32.080 回答
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# 中无法正常工作。

于 2013-04-10T17:56:29.580 回答