在这种情况下,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有两个潜在的好处(强调潜力):
-
一种"解开"事件处理程序的方便方法是:在订阅上调用
Dispose
(Subscribe
调用返回的内容)将具有与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};