C# 带文件系统监视程序的NServicebus

C# 带文件系统监视程序的NServicebus,c#,nservicebus,filesystemwatcher,C#,Nservicebus,Filesystemwatcher,每当检测到特定文件夹中的文件被删除时,我希望我的端点发送一个事件。我能够通过使用一个实现iwanttorunhenbusstartsandstops的类来实现它,该类反过来设置一个FileSystemWatcher来监视给定的文件夹。我的问题是,这是使用nservicebus的最佳方式,还是我遗漏了一些可能会给我带来麻烦的东西 这是我的密码: public class FileSystem : IWantToRunWhenBusStartsAndStops { private FileS

每当检测到特定文件夹中的文件被删除时,我希望我的端点发送一个事件。我能够通过使用一个实现iwanttorunhenbusstartsandstops的类来实现它,该类反过来设置一个FileSystemWatcher来监视给定的文件夹。我的问题是,这是使用nservicebus的最佳方式,还是我遗漏了一些可能会给我带来麻烦的东西

这是我的密码:

public class FileSystem : IWantToRunWhenBusStartsAndStops
{
    private FileSystemWatcher watcher;

    public void Start()
    {
        ConfigFileWatcher();
    }

    public void Stop()
    {

    }

    [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
    private void ConfigFileWatcher()
    {
        watcher = new FileSystemWatcher();
        watcher.Path = @"c:\";
        /* Watch for changes in LastAccess and LastWrite times, and
           the renaming of files or directories. */
        watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
           | NotifyFilters.FileName | NotifyFilters.DirectoryName;
        // Only watch text files.
        watcher.Filter = "*.txt";

        // Add event handlers.
        watcher.Changed += new FileSystemEventHandler(OnChanged);
        watcher.Created += new FileSystemEventHandler(OnChanged);
        watcher.Deleted += new FileSystemEventHandler(OnChanged);

        // Begin watching.
        watcher.EnableRaisingEvents = true;
    }

    // Define the event handlers. 
    private static void OnChanged(object source, FileSystemEventArgs e)
    {
        // Specify what is done when a file is changed, created, or deleted.
        Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);

        // fire off an event here...
    }

}

如果查看NServiceBus源代码,在容器初始化中,您将看到iWantorUnshenbusStartAndStops以每次调用一次的生命周期注册

ForAllTypes<IWantToRunWhenBusStartsAndStops>(TypesToScan, t => configurer.ConfigureComponent(t, DependencyLifecycle.InstancePerCall));

有一件事你需要记住:每个卫星都有自己的队列。在这种情况下,它将始终为空。

如果您查看NServiceBus源代码,在容器初始化中,您将看到iWantorUnshenbusStartAndStops以每次调用一次的生命周期进行注册

ForAllTypes<IWantToRunWhenBusStartsAndStops>(TypesToScan, t => configurer.ConfigureComponent(t, DependencyLifecycle.InstancePerCall));

有一件事你需要记住:每个卫星都有自己的队列。在这种情况下,它将始终为空。

根据其他答案和注释,我相信您的FileSystemWatcher通过订阅OnChanged事件而保持活动状态

这实际上是导致内存泄漏的一个(相当)常见的原因,尽管在您的情况下,它实际上使您的监视程序保留在内存中,并允许它继续运行。从OnChanged()方法中删除static关键字,我相信您将看到预期的行为


当然,您希望FileSystemWatcher继续运行。一种选择可能是使watcher变量本身保持静态。如果你这样做,我会把它放在一个单独的类中,然后通过实现iwanttorunhenbusstartsandstops的类初始化它。

根据其他答案和评论,我相信你的FileSystemWatcher通过订阅OnChanged事件而保持了活力

这实际上是导致内存泄漏的一个(相当)常见的原因,尽管在您的情况下,它实际上使您的监视程序保留在内存中,并允许它继续运行。从OnChanged()方法中删除static关键字,我相信您将看到预期的行为



当然,您希望FileSystemWatcher继续运行。一种选择可能是使watcher变量本身保持静态。如果你这样做,我会把它放在一个单独的类中,然后通过实现iwanttorunhenbusstartsandstops的类初始化它。

你到底有什么问题/担心?我想我只是想知道是否有更好的方法来实现这一点,或者这种方法是否存在性能问题?iwanttorunshenbusstartsandstops接口是否打算像这样使用?您测试过它是否工作吗?汽车启动后,它不会被处理掉吗?是的,它会工作,甚至在汽车启动后也会继续工作。我还以为它会被处理掉。这就是为什么我不确定这是否是正确的方法,因为它的某些方面感觉“不对”:)您的问题/顾虑到底是什么?我想我只是想知道是否有更好的方法来做到这一点和/或这种方法是否存在性能问题?iwanttorunshenbusstartsandstops接口是否打算像这样使用?您测试过它是否工作吗?汽车启动后,它不会被处理掉吗?是的,它会工作,甚至在汽车启动后也会继续工作。我还以为它会被处理掉。这就是为什么我不确定这是否是正确的方法,因为它感觉有些“错误”:)这是有道理的,但奇怪的是,即使在调用Start()之后,文件监视程序事件仍会继续触发。也许这个观察者资源阻止了对象被处置?你有关于卫星的文件吗?如果有帮助的话,我使用的是5.0版。正如Phil在回答中提到的,因为您的事件处理程序是一个静态方法,订阅不会被释放,并且观察者会被GC保持活动状态。我用这条评论编辑了我的答案,并添加了一个示例卫星实现,什么会导致卫星类启动?我使用Nuget的NServiceBus.Host(使用RavenDB持久性)创建了一个项目。当我使用iwanttorunhenbusstarts从一个类运行静态FileSystemWatcher并停止时,它运行正常并给出文件更改事件。但是,当我根据Alexy的示例将其更改为在实现ISatellite的类中使用非静态FileSystemWatcher时,从未调用Start()方法。我还需要做些什么吗?我不使用他们的内部容器API,但使用Autofac时,您需要将其注册到.AsImplementedInterfaces(),以便消费者在与NServiceBus支持部门的Hadi交谈后能够将其作为ISatellite进行解析,事实证明,我所要做的就是将禁用的参数get设置为返回false。根本不需要配置行(尽管它可以工作)。卫星是“开箱即用”的。这是有道理的,但奇怪的是,即使在调用Start()之后,文件监视程序事件仍会继续触发。也许这个观察者资源阻止了对象被处置?你有关于卫星的文件吗?如果有帮助的话,我使用的是5.0版。正如Phil在回答中提到的,因为您的事件处理程序是一个静态方法,订阅不会被释放,并且观察者会被GC保持活动状态。我用这条评论编辑了我的答案,并添加了一个示例卫星实现,什么会导致卫星类启动?我使用Nuget的NServiceBus.Host(使用RavenDB持久性)创建了一个项目。当我使用iwanttorunhenbusstarts从一个类运行静态FileSystemWatcher并停止时,它运行正常并给出文件更改事件。但是,当我根据Alexy的示例将其更改为在实现ISatellite的类中使用非静态FileSystemWatcher时,从未调用Start()方法。我还有什么事要做吗?我没有