2013-04-10 74 views
1

我有C#5.0应用程序,涉及在多个不同的目录上使用FileSystemWatcher使数据可用FileSystemWatcher事件处理程序

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

这是一个服务器应用程序,我期望FileSystemWatcher的事件处理程序会经常被调用。我必须确保他们能跟上自己的工作,并且不会落后于回应文件变更事件。值得一提的是,被监视的目录对运行应用程序的机器是本地的。

我该如何让FileSystemWatcherCustomDirectorySetting对象快速提供给每个FileSystemWatcher的事件处理程序,并且我应该在使用Task Parallel Library来执行此实现吗?我是TPL的新手,所以我很感谢您对哪些方面最合适的想法。

+0

什么是CustomDirectorySetting对象? – Paparazzi 2013-04-10 14:20:43

+0

@Blam - 对于混淆抱歉 - 我应该解释说这是一种特定于应用程序的自定义类型。它不是BCL的一部分。 – STLDeveloper 2013-04-10 16:22:37

回答

0

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

+0

我没想过要试试这个。我肯定会给它一个镜头。 – STLDeveloper 2013-04-10 16:24:28

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; 
} 

在这种情况下,它可能是一个好主意,不要直接在拉姆达使用循环变量,因为它会无法正常工作旧版本的C#。

+0

这看起来是一个非常有趣的解决方案。我的一个问题是FileSystemWatcher是否会在foreach循环的每次迭代中超出范围时继续正常工作。我的印象是它必须坚持才能正常运作。或者,也许一旦事件处理程序被设置,它可以被解雇? – STLDeveloper 2013-04-11 12:25:05