如何将变量传递给 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 作为全局变量,它将无效,因为计数会随着每个文件更改事件而更改,并且它是从用户传递的。
最简单的方法是使用 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);
}
}