如何知道哪个FileSystemWatcher正在调用Method?

时间:2011-08-17 10:09:04

标签: c# event-handling filesystemwatcher

我正在创建一个FileSystemWatchers列表。

List<ExtSystemFileWatcher> fswMonitors = new List<FileSystemWatcher> ();

列表中的数量是动态的,具体取决于用户。这是从INI文件完成的,并且创建了来自我自己的Monitor类的Monitor对象数组。该类只有变量,如Montior数,监视路径,E​​xt寻找等。

if (iNumberMonitors > 0)
{
    obMonitors = ReadMonitors(iNumberMonitors);

    for (int iCounter = 0; iCounter < iNumberMonitors; iCounter++)
    {
        FileSystemWatcher fswCurrent = new FileSystemWatcher();
        fswCurrent.Path = obMonitors[iCounter].strMonPath;
        fswCurrent.EnableRaisingEvents = true;
        fswCurrent.NotifyFilter = NotifyFilters.FileName;
        fswCurrent.Filter = "*." + obMonitors[iCounter].strMonExt;
        fswCurrent.Deleted += OnDelete;
        fswMonitors.Add(fswCurrent);
    }
}

在每个FileSystemWatcher调用Delete On事件时调用的'OnDelete'方法中,我需要知道哪个FileSystemWatchers正在调用它。

我的问题是如何知道List中的哪个FileSystemMonitor正在调用该方法?

6 个答案:

答案 0 :(得分:2)

您可以使用闭包来挂钩“删除事件” 而不是传递方法本身:

fswCurrent.Deleted += OnDelete;

你传递了类似

的内容
fswCurrent.Deleted += (sender, e) => OnDelete(sender, e, iCounter)

当然,您需要更改OnDelete的签名才能获取额外的索引。 在阅读你的评论后,你可能不需要它,正如其他答案所暗示的那样。

答案 1 :(得分:2)

除了在eventHandler中查看sender之外,您还需要其他什么吗?

private void OnDelete(object sender, ...)
{
    var watcher = (FileSystemWatcher) sender;

    // probably list.IndexOf here if you really need an index
}

答案 2 :(得分:1)

事件处理程序有一个sender参数,该参数是对引发事件的FileSystemWatcher的引用。

private static void OnDeleted(object source, FileSystemEventArgs e)
{
    FileSystemWatcher watcher = source as FileSystemWatcher;
    if(watcher != null)
    {
        string deletedFile = e.FullPath;
        //Update db with watcher and deletedFile
    }
}

答案 3 :(得分:1)

OnDelete方法中的

“sender”参数将指向事件的发起者

void OnDelete(object sender, EventArgs e)
{
    var watcher = ((FileSystemWatcher) sender);
    .....
}

答案 4 :(得分:1)

只需转换附加到Deleted事件的事件处理程序的sender参数。

例如:

class Program
{
    static void Main(string[] args)
    {
        var watcher = new FileSystemWatcher { Path = @"c:\temp", Filter = "*.txt" };
        watcher.Deleted += watcher_Deleted;
        watcher.EnableRaisingEvents = true;
        Console.ReadLine();
    }

    static void watcher_Deleted(object sender, FileSystemEventArgs e)
    {
        var watcher = sender as FileSystemWatcher;
    }
}

答案 5 :(得分:0)

可以检查这些池化对象中是否有一个哈希码。哪个应该是唯一的。