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什么都没有,这里没有样本,这个问题中的优秀资源也没有涵盖这个名称空间。

有人有什么建议吗?

Guide to System.Reactive.Joins

发现了一个很好的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