1

当我学习 Rx(反应式扩展)时,我想知道给定的 2 段代码之间的区别:

代码 1

static void Main(string[] args)
{
FileSystemWatcher watcher = new FileSystemWatcher(@"C:\Logs", "*.*");
            watcher.EnableRaisingEvents = true;


            var source = Observable.FromEvent<FileSystemEventHandler, FileSystemEventArgs>(handler =>
                {
                    FileSystemEventHandler fsHandler = (sender, e) =>
                        {
                            handler(e);
                        };
                    return fsHandler;
                },

                fsHandler => watcher.Created += fsHandler,

                fsHandler => watcher.Created -= fsHandler
                    );

            source.Subscribe(x => Console.WriteLine(x.Name + "is created"));

            Console.Read();
}

代码 2

static void Main(string[] args)
        {

            FileSystemWatcher watcher = new FileSystemWatcher(@"C:\Logs", "*.*");
            watcher.EnableRaisingEvents = true;

            watcher.Created += watcher_Created;

            Console.Read();
        }


        static void watcher_Created(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine(e.Name.ToString());
        }

上述 2 段代码产生相同的结果有什么不同?

即使我浏览了核心部分,发现这两个代码行都在单独的线程上执行,那么它们之间有什么区别,为什么我在这种情况下使用 Rx?

提前致谢!

4

1 回答 1

1

在这个具体的例子中,使用 Rx 有两个潜在的好处(强调潜力):

  • 一种“取消连接”事件处理程序的便捷方法:调用Dispose订阅(调用返回的东西Subscribe)将具有与watcher.Created -= handler

  • 一种将来自此来源的事件与其他(和,就此而言)来源组合的方法。例如,如果您的用例是“我需要知道何时创建文件,然后写入了 3 次,等等”,您可以从 上公开的各种事件创建多个“观察者” ,然后创建一个查询只有在正确的条件发生时才会触发IObservableIEnumerableIObservableFileSystemWatcher

在伪 LINQ 中:

var createEvents = <get created event handler>;
var changeEvents = <get changed event handler>;
var createThenChangeThenChangeThenChange = 
    from create in createEvents
    where create.Name == "some file I care about"
    from firstChange in changeEvents
    from secondChange in changeEvents
    from thirdChange in changeEvents
    select new { create, firstChange, secondChange, thirdChange};
于 2013-02-14T16:41:40.217 回答