Guide to System.Reactive.Joins
本文关键字:Joins Reactive System to Guide | 更新日期: 2023-09-27 18:27:03
我正在寻找System.Reactive.Joins的简介/一些文档,其中包括Pattern、Plan、QueryablePattern和QueryablePlan类。谷歌没有发现任何东西("System.Reactive.Joins"),MSDN什么都没有,这里没有样本,这个问题中的优秀资源也没有涵盖这个名称空间。
有人有什么建议吗?
发现了一个很好的SO问题,它显示了用法,但对我来说,Plan and Pattern的总体目的是创建可观察的组成单元,而不是组合的可观察。语义,我知道,但对我来说,使用这种语法似乎比使用其他各种";加入";方法。它允许您将连接与投影完全分离,这样您就可以存储中间计划,并随时将其与其他可观测值组合在一起。
例如:
// Suppose we have observables o1, o2, ..., o9.
// All IObservable<int>.
var o1and2 = o1.And(o2); // Store this bad boy for later use. Pattern<int, int>
var o5and6and9 = o5
.And(o6)
.And(o9)
.Then((t1, t2, t3) => t1 + t2 + t3); // Plan<int>
var o3and7 = o3
.And(o7)
.Then((t1, t2) => string.Format("Result: {0}", t1 + t2)); // Plan<string>
var o12ando8and6 = o1and2
.And(o8)
.And(o6)
.Then((t1, t2, t3, t4) => ((decimal) t1, t2, t3.ToString(), t4));
// Plan<(decimal, int, string, int)>
// "When" groups similar results together.
// It will fire when any of the Patterns give a result.
var obs1 = Observable
.When(o1and2.Then((t1,t2) => t1+t2), o5and6and9); // IObservable<int>
var obs2 = Observable.When(o3and7); // IObservable<string>
var obs3 = Observable.When(o12ando8and6); // IObservable<(decimal, int, string,int)>
SO条款:.NET的反应式扩展(Rx):在所有事件完成后采取行动
此外,还发现了一份RX文档,该文档实际上有助于理解如何使用它:http://www.clipcode.net/mentoring/RxReferenceLibrary.pdf[adead]
这是我唯一发现的:Rx中的Join Patterns。我也想看看关于这些主题的其他资源。
.NET的反应式扩展(Rx)blogs.msdn.com
然后使用连接模式等待三个结果中的前两个返回。
如何连接多个IOobservable序列stackoverflow.com
在v.2838中使用新的Join操作符怎么样…
JavaScript反应式扩展简介-新发布和加入weblogs.asp.net
JavaScript的反应式扩展,其中包括我最近谈到的许多更改,包括第三方库集成,我在前几篇文章中介绍的聚合,以及今天文章主题的联接。
System.Reactive.Joins命名空间
Microsoft对System.Reactive.Joins命名空间的定义。
除了我在这里提到的例子(现在更新为使用Observable.When而不是Observable.Join)之外,对我来说,一般的概念似乎是,当你想组成事件本身,而不是事件的内容时,你会使用When和Join模式。因此,当我想做一些与所观察的数据相关的事情时,我会使用其他查询运算符,如SelectMany。当我想做一些事情纯粹是为了响应哪些事件,以及哪些事件模式以特定的顺序启动时,我会使用连接模式。现在,这并不是说你不能组合其他查询运算符,比如Where和Select,来过滤和投影IObservable中的一些值,这些值稍后将用于连接模式,但我认为这是一个很好的通用方法
我确实试着举了一些例子,但我真的没有想出更好的办法。。。只是同一概念的更复杂的情况。您希望对可能具有复杂关系的相关事件模式进行分组,这些关系在事件级别而不是在IOobservable的内容上是有意义的。
使用Reflector(或类似工具)并不是一个坏的ide,
目前,浏览源代码对于Rx来说是一个非常宝贵的工具。您可以看到它实现了什么,如何实现以及与其他标准Rx模式的比较
此外,也许你可以发布一个问题,你试图解决的问题,然后从那里开始(其他人可能会有更多的想法)
编辑:没有这样的Rx源代码。然而,即使是Rx的人也建议通过使用Reflector或类似工具对库进行分解来分析库。例如,你可以使用ILSpy,免费,下载Rx Providers Nuget,或者你有,我想,将System.Reactive.Providers.dll和System.Reactive.dll加载到其中并享受:)。它既不完美,也不正式,也不编译,至少很容易——但你可以很好地了解事情是如何运作的,它对我帮助很大,非常宝贵
我也找不到太多。但我通过自己的努力取得了一些成功。
cotacha是:delayObservable的类型参数没有任何意义。它们只是被声明为具有don't care
返回值。看起来(*我不知道)像该CCD_ 2仅用于监听CCD_ 3事件。
因此,我在实验中使用了Observable:
IObservable<long> timingobs = Observable.Interval(TimeSpan.FromMilliseconds(100)).Take(1);
如果你能找到一个更简单的解决方案来快速结束Observable,请告诉我。
如果使用不同数量(如600)的毫秒,则结果会有所不同。
代码:
var apples = Observable.Create<Apple>(o => Task.Run(() =>
{
o.OnNext(Apple.boskop);
Thread.Sleep(500);
o.OnNext(Apple.boskop);
o.OnNext(Apple.granny);
Thread.Sleep(500);
o.OnNext(Apple.pink);
o.OnNext(Apple.pink);
Thread.Sleep(500);
o.OnNext(Apple.granny);
o.OnCompleted();
return Disposable.Empty;
}));
var pears = Observable.Create<Pear>(o => Task.Run(()=>
{
o.OnNext(Pear.AA);
Thread.Sleep(300);
o.OnNext(Pear.BB);
o.OnNext(Pear.CC);
Thread.Sleep(300);
o.OnNext(Pear.BB);
Thread.Sleep(300);
o.OnNext(Pear.DD);
o.OnCompleted();
return Disposable.Empty;
}));
IObservable<long> timingobs = Observable.Interval(TimeSpan.FromMilliseconds(100)).Take(1);
pears.Join(apples, a => timingobs, p => timingobs, (pear, apple) => $"{apple} + {pear}")
.Subscribe(Console.WriteLine);
Console.ReadKey();
结果(100ms):
boskop + AA
pink + DD
pink + DD
结果(600ms):
boskop + AA
boskop + BB
boskop + CC
boskop + AA
boskop + BB
boskop + CC
granny + AA
granny + BB
granny + CC
boskop + BB
boskop + BB
granny + BB
boskop + DD
granny + DD
pink + BB
pink + DD
pink + BB
pink + DD
granny + DD