我有C#5.0应用程序,涉及在许多不同的目录上使用FileSystemWatcher
。
此应用程序包含List<>
个对象。每个对象都描述了被监视的目录,以及FileSystemWatcher
事件处理程序需要访问的许多其他数据。这些对象的类型为CustomDirectorySetting
。
这是一个服务器应用程序,我希望经常调用FileSystemWatcher
的事件处理程序。我必须确保他们能够跟上他们的工作,而不是落后于对文件更改事件的响应。可能值得补充的是,正在监视的目录对于运行应用程序的计算机是本地的。
如何快速将FileSystemWatcher
的{{1}}对象提供给每个CustomDirectorySetting
的事件处理程序,我是否应该考虑使用任务并行库来实现此实现?我是TPL的新手,所以我很感激你对哪些方面最合适的想法。
答案 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#中无法正常工作。