在另一个类中绑定事件

本文关键字:绑定 事件 另一个 | 更新日期: 2023-09-27 18:01:40

这是我的第一篇c#博文。

我对事件绑定有一个问题。

我有一个FileWatcher,我想绑定到一个叫做FileWatcherEvents的单独类中定义的函数。

我不希望事件被声明在Program类,这是如何做到的?

可以看到,我尝试绑定CreatedDeleted的事件。

问题是当我在文件夹中删除或创建文件时不会调用这些事件。但是当我在Program类中声明事件处理程序时,它确实有效。

任何帮助或见解都是感激的。

项目


using System.IO;
class Program : ServiceBase
{
    private FileSystemWatcher _watcher;
    public Program()
    {
        FileWatcherEvents fwe = new FileWatcherEvents();
        this._watcher = new FileSystemWatcher();
        ((System.ComponentModel.ISupportInitialize)(this._watcher)).BeginInit();
        // 
        // _watcher
        // 
        this._watcher.EnableRaisingEvents = true;
        this._watcher.Filter = "*.txt";
        this._watcher.NotifyFilter =
        ((NotifyFilters)(((((NotifyFilters.FileName 
            | NotifyFilters.DirectoryName)
            | NotifyFilters.LastWrite)
            | NotifyFilters.LastAccess)
            | NotifyFilters.CreationTime)));
        this._watcher.Path = "T:''out''";
        this._watcher.Deleted += new FileSystemEventHandler(fwe.ShipmentFileCreated);
        this._watcher.Created += new FileSystemEventHandler(fwe.FileDeleted);
        ((System.ComponentModel.ISupportInitialize)(this._watcher)).EndInit();
    }
    static void Main(string[] args)
    {
        Program prg = new Program();
        Console.Write(FileManager.getNewestFile("T:''out''"));
        while (Console.Read() != 'q') ;
    }
}

FileWatcherEvents


class FileWatcherEvents
{
    public void ShipmentFileCreated(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine("CREATED: " + sender.ToString() + e.ToString());
    }
    public void FileDeleted(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine("DELETED: " + sender.ToString() + e.ToString());
    }
}

在另一个类中绑定事件

我认为您需要在更大的作用域中声明fwe,比如在Program级而不是在Program构造函数中声明fwe。否则,对象将消失,可能导致它的所有事件也会消失(当实例消失时,处理实例上事件的函数会发生什么,从来没有完全清楚,但事件仍然可能发生,但很可能它们将不再运行)。

编辑:

我对你的代码做了一些小小的调整。主要是我必须将EnableRaisingEvents移动到块的末尾,因为如果在设置路径之前这样做,. net会抛出异常。你怎么没发现那个例外?

class Program
{
    private FileSystemWatcher _watcher;
    public Program()
    {
        FileWatcherEvents fwe = new FileWatcherEvents();
        this._watcher = new System.IO.FileSystemWatcher();
        this._watcher.Filter = "*.txt";
        this._watcher.NotifyFilter = ((System.IO.NotifyFilters)(((((
            System.IO.NotifyFilters.FileName | System.IO.NotifyFilters.DirectoryName) 
            | System.IO.NotifyFilters.LastWrite) | System.IO.NotifyFilters.LastAccess) 
            | System.IO.NotifyFilters.CreationTime)));
        this._watcher.Path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 
        this._watcher.Deleted += new System.IO.FileSystemEventHandler(fwe.ShipmentFileCreated); 
        this._watcher.Created += new System.IO.FileSystemEventHandler(fwe.FileDeleted);
        this._watcher.EnableRaisingEvents = true;
        Console.ReadLine();
    }
    public static void Main()
    {
        Program prg = new Program();
        using (System.IO.StreamWriter w = new System.IO.StreamWriter(
            System.IO.Path.Combine(
            Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "TestFile.txt"), false))
        {
            w.WriteLine(DateTime.Now.ToLongTimeString());
        }
        Console.ReadLine();
    }
}
class FileWatcherEvents
{
    public void ShipmentFileCreated(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine("CREATED: " + sender.ToString() + e.ToString());
    }
    public void FileDeleted(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine("DELETED: " + sender.ToString() + e.ToString());
    }
}

结果代码工作得很好,事件被触发,但是函数没有被触发,因为私有FileSystemWatcher对象中的*.txt过滤器。