【问题标题】:How to implement filewatcher using Reactive extensions如何使用响应式扩展实现文件观察器
【发布时间】:2012-12-02 14:20:52
【问题描述】:

我是 Rx 的新手,希望在我当前的项目中使用它。我正在尝试实现一个文件观察器系统。至少现在我只对文件创建事件感兴趣。但是在尝试运行以下代码时,我收到“值不能为空错误消息”。 请有人帮我解决下面的代码。

class Program
{
    static void Main(string[] args)
    {
        IDisposable writer = new FileSystemObservable(@"D:\Code\Rx\Dropbox\", "*.*", false)
                            .CreatedFiles
                            .Where(x => (new FileInfo(x.FullPath)).Length > 0)
                            .Select(x => x.Name)
                            .Subscribe(Console.WriteLine);
        Console.ReadLine();
    }
}


class FileSystemObservable
{
    private readonly FileSystemWatcher fileSystemWatcher;

    public FileSystemObservable(string directory, string filter, bool includeSubdirectories)
    {
        fileSystemWatcher = new FileSystemWatcher(directory, filter)
            {
                EnableRaisingEvents = true,
                IncludeSubdirectories = includeSubdirectories
            };

        CreatedFiles = Observable.FromEventPattern<FileSystemEventHandler, FileSystemEventArgs>
                (h => fileSystemWatcher.Created += h,
                h => fileSystemWatcher.Created -= h)
                .Select(x => new { x.EventArgs }) as IObservable<FileSystemEventArgs>;

        Errors = Observable.FromEventPattern<ErrorEventHandler, ErrorEventArgs>
                (h => fileSystemWatcher.Error += h,
                h => fileSystemWatcher.Error -= h)
                .Select(x => new { x.EventArgs }) as IObservable<ErrorEventArgs>;
    }

    public IObservable<ErrorEventArgs> Errors { get; private set; }

    public IObservable<FileSystemEventArgs> CreatedFiles { get; private set; }
}

【问题讨论】:

    标签: c# system.reactive


    【解决方案1】:

    结果

    Select(x => new { x.EventArgs }) as IObservable<ErrorEventArgs> 
    

    .Select(x => new { x.EventArgs }) as IObservable<FileSystemEventArgs>;
    

    行将始终返回 null。

    Select(x =&gt; new { x.EventArgs }) 的类型是IObservable&lt;'a&gt;,其中'a 是某种匿名类型。

    你应该改用:

    CreatedFiles = 
        Observable.FromEventPattern<FileSystemEventHandler, FileSystemEventArgs>(
            h => fileSystemWatcher.Created += h,
            h => fileSystemWatcher.Created -= h)
        .Select(x => x.EventArgs);
    
    Errors = 
        Observable.FromEventPattern<ErrorEventHandler, ErrorEventArgs>(
            h => fileSystemWatcher.Error += h,
            h => fileSystemWatcher.Error -= h)
        .Select(x => x.EventArgs);
    

    【讨论】:

    • 谢谢李!现在错误消失了,我可以编译程序了。但是,我没有得到创建的文件列表。
    • 除了这个 CreatedFiles 和 Errors 还需要定义为 IObservable> 和 IObservable>
    • @NarayanAkhade - 对我来说没问题。我会直接订阅观察者的事件,以确保它们按照您的预期被引发,但我认为您的 Observable 定义正确。
    • @Dev - Select 子句从EventPatter&lt;T&gt; 获取事件参数,从FromEventPattern 返回。
    • 非常感谢李!问题出在检查文件长度的 where 子句中!我正在创建 0KB 的文件进行测试:(!
    猜你喜欢
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多