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

本文关键字:事件 变量 | 更新日期: 2023-09-27 18:36:16

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

例如

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

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

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

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

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

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

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

为什么不FileSystemWatcher子类并将计数传递到子类的构造函数中?

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

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

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

private static int _count;
private void fileSystemWatcher_Changed(object sender, EventArgs e)
{
    Console.WriteLine("fileSystemWatcher_Changed was called {0} times",
                      ++_count);
}

请注意,如果您在更改的处理程序中使用全局变量,则应用锁将变量的任何使用括起来,因为更改的事件将由多个线程调用。

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