c# - 如何使用 Reactive 扩展实现 filewatcher

标签 c# system.reactive

我是 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; }
}

最佳答案

结果

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

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

行将始终返回 null。

Select(x => new { x.EventArgs }) 的类型是IObservable<'a>其中 '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);

关于c# - 如何使用 Reactive 扩展实现 filewatcher,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13670142/

相关文章:

c# - Observable.Range 是否违反了 Observable 契约?

system.reactive - 自第一个新组元素以来超时的 Rx 缓冲区

c# - 具有不同线程安全模式的 System.Lazy<T>

c# - Caliburn.micro View ViewModel 名称解析问题

c# - PetaPoco:获取复合对象

c# - 如何使用 Reactive Extensions 对状态进行轮询?

c# - 在我的 C# 应用程序中结合使用 Task 和 IObservable 是一种不好的做法吗?

c# - tableadaptor - 删除行

c# - Xamarin.Form FlowListView - 刷新列表时出现 NullReferenceException

c# - 如何使用 1000 个观察者高效运行 Observable.Where()?