Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何知道哪个FileSystemWatcher正在调用方法?_C#_Event Handling_Filesystemwatcher - Fatal编程技术网

C# 如何知道哪个FileSystemWatcher正在调用方法?

C# 如何知道哪个FileSystemWatcher正在调用方法?,c#,event-handling,filesystemwatcher,C#,Event Handling,Filesystemwatcher,我正在创建一个文件系统观察者列表 List<ExtSystemFileWatcher> fswMonitors = new List<FileSystemWatcher> (); List fswMonitors=新列表(); 列表中的数量是动态的,具体取决于用户。这是通过INI文件完成的,并从我自己的监视器类创建了一个监视器对象数组。该类只是有一些变量,如Montior编号、要监视的路径、要查找的Ext等 if (iNumberMonitors > 0) {

我正在创建一个文件系统观察者列表

List<ExtSystemFileWatcher> fswMonitors = new List<FileSystemWatcher> ();
List fswMonitors=新列表();
列表中的数量是动态的,具体取决于用户。这是通过INI文件完成的,并从我自己的监视器类创建了一个监视器对象数组。该类只是有一些变量,如Montior编号、要监视的路径、要查找的Ext等

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);
    }
}
if(iNumberMonitors>0)
{
obMonitors=读取监视器(iNumberMonitors);
对于(int-iCounter=0;iCounter
在每个FileSystemWatcher在触发Delete事件时调用的“OnDelete”方法中,我需要知道哪个FileSystemWatcher正在调用它


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

可能需要检查这些池对象中是否每个都包含哈希代码。应该是唯一的。

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

fswCurrent.Deleted += OnDelete;
你通过了类似这样的考试

fswCurrent.Deleted += (sender, e) => OnDelete(sender, e, iCounter)
当然,您需要更改OnDelete的签名以获取附加索引。
但是,在阅读您的评论之后,您可能不需要它,正如其他答案所示。

事件处理程序有一个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
    }
}

除了在eventHandler中检查
sender
,您还需要其他什么吗

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

    // probably list.IndexOf here if you really need an index
}
OnDelete方法中的“sender”参数将指向事件的发起人

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

只需强制转换附加到已删除事件的事件处理程序的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;
    }
}

我需要知道当我使用OnDelete方法时,哪个FileSystemWatcher正在调用。我想向SQLServer DB表写入哪些用户定义的监视器(例如FileSystemWatchers)刚刚执行了工作,哪些文件被删除。感谢您向我介绍如何通过闭包更改事件处理程序的签名。这是一个启示!