CodeGo.net>如何正确引发自定义事件?

我需要一个自定义事件,如果在特定目录中找到/创建了新文件/现有文件,则应该引发该事件.要检查是否创建了新文件,我使用SystemFileWatcher,它工作正常.为了检查程序启动时是否存在某些文件,我写了一些行,并且可以使用.

我将此类用于事件args:

public class FileDetectEventArgs : EventArgs
{
    public String Source { get; set; }
    public String Destination { get; set; }
    public String FullName { get; set; }

    public FileDetectEventArgs(String source, String destination, String fullName)
    {
        this.Source = source;
        this.Destination = destination;
        this.FullName = fullName;
    }
}

如果SystemFileWatcher引发FileCreated事件,则使用以下代码行:

public void onFileCreated(object sender, FileSystemEventArgs e)
{
    // check if file exist
    if (File.Exists(e.FullPath))
    {
        OnNewFileDetect(new FileDetectEventArgs(source, destination, e.FullPath));  
    }
}

如果文件存在,我尝试以这种方式引发事件:

public void checkExistingFiles(String source, String filter)
    {
        DirectoryInfo di = new DirectoryInfo(source);
        FileInfo[] fileInfos = di.GetFiles();
        String fileFilter = filter.Substring(filter.LastIndexOf('.'));       

        foreach (FileInfo fi in fileInfos)
        {
            if (fi.Extension.Equals(fileFilter))
            {
                OnNewFileDetect(new FileDetectEventArgs(source, destination, fi.FullName));                   
            }
        }
    }

这是OnNewFileDetect事件:

protected void OnNewFileDetect(FileDetectEventArgs e)
    {
        if (OnNewFileDetectEvent != null)
        {
            OnNewFileDetectEvent(this, e);
        }
    }

问题是,如果onFileCreated-Event引发了我的OnNewFileDetect-Event,则一切正常.但是,如果checkExistingFiles找到了一些现有文件并尝试引发OnNewFileDetect-Event,则不会发生任何事情.我发现OnNewFileDetectEvent-Object为null,因此什么也没有发生.但是,如果触发了onFileCreated-Event,为什么它不为null?

解决方法:

But why its not null if the onFileCreated-Event is fired?

除非有人订阅该事件,否则该事件将为null.

附带说明一下,我会考虑切换到引发事件的更好模式,以及在此处使用标准C#/.NET命名.这更像是:

// The event...
public EventHandler<FileDetectedEventArgs> NewFileDetected;

// Note the naming
protected void OnNewFileDetected(FileDetectedEventArgs e)
{
    // Note this pattern for thread safety...
    EventHandler<FileDetectedEventArgs> handler = this.NewFileDetected; 
    if (handler != null)
    {
        handler(this, e);
    }
}
上一篇:python-Django框架:如何集中捕获所有发生的服务器错误并在此类错误上触发事件


下一篇:php-为什么我的事件监听器未在laravel 5中触发?