C# 在这种情况下,Rx和.Net之间应该使用什么来进行事件合成?
在学习Rx(无功扩展)时,我想知道给定的2段代码之间的区别: 代码1C# 在这种情况下,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
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
“watchers”,然后创建一个仅在出现正确条件时才会触发的查询IObservable
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
“watchers”,然后创建一个仅在出现正确条件时才会触发的查询IObservable
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实现