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