Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在这种情况下,Rx和.Net之间应该使用什么来进行事件合成?_C#_C# 4.0_System.reactive_Reactive Programming - Fatal编程技术网

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

C# 在这种情况下,Rx和.Net之间应该使用什么来进行事件合成?,c#,c#-4.0,system.reactive,reactive-programming,C#,C# 4.0,System.reactive,Reactive Programming,在学习Rx(无功扩展)时,我想知道给定的2段代码之间的区别: 代码1 static void Main(string[] args) { FileSystemWatcher watcher = new FileSystemWatcher(@"C:\Logs", "*.*"); watcher.EnableRaisingEvents = true; var source = Observable.FromEvent<FileSystemEv

在学习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();
}
当上述两种代码产生相同的结果时,它们之间有什么不同

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


提前谢谢

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

  • “解除”事件处理程序的一种方便方法:对订阅调用
    Dispose
    (订阅调用返回的内容)将与
    watcher.Created-=handler

  • 一种将来自此源的事件与其他
    IObservable
    (以及
    IEnumerable
    )源组合的方法。例如,如果您的用例是“我需要知道文件是何时创建的,然后写入三次,等等”,那么您可以从
    FileSystemWatcher
    上公开的各种事件创建多个
    IObservable
    “watchers”,然后创建一个仅在出现正确条件时才会触发的查询

在伪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};
var createEvents=;
var changevents=;
var createnthenchange=
从createEvents中创建
其中create.Name==“我关心的某个文件”
从changeEvents中的firstChange开始
从changeEvents中的secondChange
来自changeEvents中的第三次更改
选择新建{create,firstChange,secondChange,thirdChange};

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

  • “解除”事件处理程序的一种方便方法:对订阅调用
    Dispose
    (订阅调用返回的内容)将与
    watcher.Created-=handler

  • 一种将来自此源的事件与其他
    IObservable
    (以及
    IEnumerable
    )源组合的方法。例如,如果您的用例是“我需要知道文件是何时创建的,然后写入三次,等等”,那么您可以从
    FileSystemWatcher
    上公开的各种事件创建多个
    IObservable
    “watchers”,然后创建一个仅在出现正确条件时才会触发的查询

在伪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};
var createEvents=;
var changevents=;
var createnthenchange=
从createEvents中创建
其中create.Name==“我关心的某个文件”
从changeEvents中的firstChange开始
从changeEvents中的secondChange
来自changeEvents中的第三次更改
选择新建{create,firstChange,secondChange,thirdChange};

同意在OP示例中Rx是过度杀伤力。正如您所指出的,当编写更复杂的操作时,它开始变得有用。如果您想使用DI将事件/可观察事件传递给其他消费者,它也很有用。@JimWooley是的,一旦您开始将事情链接在一起,Rx真的很有用……对于简单的一次性事件,我通常只使用“普通”方法。真的。为了进行比较,我对三个FileSystemWatcher处理程序进行了后期合并,以创建一个实时MRU实现,并一致认为在OP示例中Rx是过度杀伤力。正如您所指出的,当编写更复杂的操作时,它开始变得有用。如果您想使用DI将事件/可观察事件传递给其他消费者,它也很有用。@JimWooley是的,一旦您开始将事情链接在一起,Rx真的很有用……对于简单的一次性事件,我通常只使用“普通”方法。真的。为了进行比较,我有一个合并三个FileSystemWatcher处理程序的帖子,以创建一个实时MRU实现