如何在C#中将变量传递给事件?

3
我正在使用FileSystemWatcher工具,当发生变化事件时,我想传递一个整数变量。
例如:
int count = someValue;
 FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = "C:\temp";
watcher.Changed += new FileSystemEventHandler(fileSystemWatcher_Changed);

在fileSystemWatcher_Changed事件中,我想要获取计数器的值并进行一些操作。但是我该如何获取该值呢?
如果我将计数器设置为全局变量,那么它将无效,因为每次文件更改事件都会更改计数器的值,并且该值是由用户传递的。

展示Count、Watcher和Owner(一个表单?)之间的连接。这是桌面应用还是Asp.net? - H H
5个回答

5
最简单的方法是使用lambda表达式:
watcher.Changed += (sender, args) => HandleWatcherChanged(count);

如果该方法需要更新值,那么您可能希望通过引用传递count


1
什么是HandleWatcherChanged? - InfoLearner
@KnowledgeSeeker 这是替换你的 fileSystemWatcher_Changed(..) 方法的名称。如果你需要访问这些原始参数,你可以使用 HandleWatcherChanged(count, sender, args) - Adam
1
这是一个lambda表达式。它基本上是一种内联声明方法的方式。您正在声明一个匿名方法,其参数将被称为“sender”和“args”。这些参数的类型(以及方法的返回类型)是根据您使用它的方式推断出来的。 - Tim S.

3
为什么不继承 FileSystemWatcher 并将计数器传递给子类的构造函数呢?

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接