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

C# 使数据可用于FileSystemWatcher事件处理程序,c#,.net,task-parallel-library,filesystemwatcher,C#,.net,Task Parallel Library,Filesystemwatcher,我有一个C#5.0应用程序,它涉及在许多不同的目录上使用FileSystemWatcher 此应用程序包含对象的列表。每个对象都描述被监视的目录,以及需要由FileSystemWatcher事件处理程序访问的许多其他数据。这些对象的类型为CustomDirectorySetting 这是一个服务器应用程序,我希望经常调用FileSystemWatcher的事件处理程序。我必须确保他们能够跟上工作进度,不会在响应文件更改事件时落后。值得一提的是,被监视的目录是运行应用程序的机器的本地目录 如何使F

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

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

这是一个服务器应用程序,我希望经常调用
FileSystemWatcher
的事件处理程序。我必须确保他们能够跟上工作进度,不会在响应文件更改事件时落后。值得一提的是,被监视的目录是运行应用程序的机器的本地目录


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

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

与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中使用循环变量,因为它在旧版本的C#中无法正常工作。

什么是CustomDirectorySetting对象?@Blam-很抱歉混淆了-我应该解释一下它是特定于应用程序的自定义类型。这不是BCL的一部分,我没想过要试试这个。我一定会试一试。这看起来是一个非常有趣的问题解决方案。我的一个问题是,当FileSystemWatcher在foreach循环的每次迭代中都超出范围时,它是否会继续正常工作。我的印象是,它必须坚持下去才能正常运作。或者,一旦设置了事件处理程序,就可以取消它?
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;
}