3

我在更改事件上使用 FileSystemWatcher,我想传递一个整数变量。

例如

int count = someValue;
 FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = "C:\temp";
watcher.Changed += new FileSystemEventHandler(fileSystemWatcher_Changed);

在 fileSystemWatcher_Changed 上,我想取计数值然后做一些工作。但是我如何获得该值。

如果我将 count 设为全局变量,它将无效,因为 count 会随着每个文件更改事件而更改,并且它是从用户传递的。

4

5 回答 5

5

最简单的方法是使用 lambda 表达式:

watcher.Changed += (sender, args) => HandleWatcherChanged(count);

count如果方法想要更新值,听起来你可能想要通过引用传递。

于 2012-06-02T15:15:49.847 回答
3

你为什么不子类FileSystemWatcher化并将你的计数传递给子类的构造函数?

于 2012-06-02T15:15:09.503 回答
1

您可以维护一个全局字典,将每个文件(路径)映射到其计数:

readonly Dictionary<string, int> filesChangeCount= 
    new Dictionary<string, int>();

然后,在您的事件处理程序中,只需在字典中增加适当的计数:

void fileSystemWatcher_Changed(object sender, FileSystemEventArgs e)
{
    lock (filesChangeCount)
    {
        int count;
        filesChangeCount.TryGetValue(e.FullPath, out count);
        filesChangeCount[e.FullPath] = count++;
    }
}
于 2012-06-02T15:30:47.813 回答
0

如果您想知道fileSystemWatcher_Changed全局调用的频率,您也可以使用静态变量。如果您想知道该类的一个特定实例中的调用次数,请删除static关键字。

private static int _count;

private void fileSystemWatcher_Changed(object sender, EventArgs e)
{
    Console.WriteLine("fileSystemWatcher_Changed was called {0} times",
                      ++_count);
}
于 2012-06-02T15:31:27.727 回答
0

请注意,如果您在更改的处理程序中使用全局变量,您应该用锁包围对变量的任何使用,因为您的更改事件将被多个线程调用。

private static int _count;
private object lockerObject = new object();
private void fileSystemWatcher_Changed(object sender, EventArgs e)
{
    lock(lockerObject)
    {
        Console.WriteLine("fileSystemWatcher_Changed was called {0} times",
                  ++_count);
    }
}
于 2016-12-20T03:17:20.120 回答