在这种情况下,Rx和.Net之间应该使用什么来进行事件合成

本文关键字:什么 事件 Rx 这种情况下 Net 之间 | 更新日期: 2023-09-27 17:59:22

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

代码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());
        }

上面两种代码在产生相同结果时有什么不同?

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

提前感谢!

在这种情况下,Rx和.Net之间应该使用什么来进行事件合成

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

  • 一种"解开"事件处理程序的方便方法是:在订阅上调用DisposeSubscribe调用返回的内容)将具有与watcher.Created -= handler 相同的效果

  • 将来自此源的事件与其他IObservable(以及IEnumerable)源组合的一种方法。例如,如果您的用例是"我需要知道什么时候创建了一个文件,然后写入三次,等等",那么您可以从FileSystemWatcher上暴露的各种事件中创建多个IObservable"观察者",然后创建一个只有在出现正确条件时才会触发的查询

在伪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};