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

时间:2012-06-02 15:13:50

标签: c# .net

我正在使用FileSystemWatcher 在Changed Event上,我想传递一个整数变量。

e.g。

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

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

如果我计算一个全局变量,它将无效,因为每个文件的计数更改都会更改事件并从用户传递。

5 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分: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++;
    }
}

答案 3 :(得分: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);
}

答案 4 :(得分: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);
    }
}