Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.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# GroupJoin,一个窗口在流完成时结束_C#_System.reactive_Rx.net - Fatal编程技术网

C# GroupJoin,一个窗口在流完成时结束

C# GroupJoin,一个窗口在流完成时结束,c#,system.reactive,rx.net,C#,System.reactive,Rx.net,我有两个数据源,它们从不同的线程转储数据。我试图通过一个键连接两个源。我可以使用GroupJoin来完成它。我必须使用可观察的。永远如此,窗口永远不会结束。就加入这股潮流而言,一切都进展顺利。当两个数据源都完成转储数据时,它们将各自的onComplete调用观测者。我希望在收到两个源的OnComplete后,流媒体将立即结束。正如我使用的Observable.Never流永远不会结束,我的aggSource的Oncomplete事件永远不会被调用 有没有办法告诉Rx,当接收到两个源的OnComp

我有两个数据源,它们从不同的线程转储数据。我试图通过一个键连接两个源。我可以使用GroupJoin来完成它。我必须使用可观察的。永远如此,窗口永远不会结束。就加入这股潮流而言,一切都进展顺利。当两个数据源都完成转储数据时,它们将各自的onComplete调用观测者。我希望在收到两个源的OnComplete后,流媒体将立即结束。正如我使用的Observable.Never流永远不会结束,我的aggSource的Oncomplete事件永远不会被调用

有没有办法告诉Rx,当接收到两个源的OnComplete时,关闭窗口,而不是无限地将其打开

我是Rx的新手,不确定这是否可以实现。下面是代码片段。提前谢谢

var l = Source1;
var r = Source2;

var q = r.GroupJoin(l,
                _ => Observable.Never<Unit>(), // windows from each left event going on forever 
                _ => Observable.Never<Unit>(), // windows from each right event going on forever
                (left, obsOfRight) => Tuple.Create(left, obsOfRight)); // create tuple of left event with observable of right events

        var joinSource =   q.SelectMany(e => {
            return e.Item2.Where(
               x =>
               {
                 return x.ID== e.Item1.ID;
               })
               .Select(v=>  (Item1:v.Value, Item2: e.Item1.Value));
        });



var aggSource = joinSource.GroupBy(x => x.Item1).SelectMany(grp =>
            {
                return grp.Scan(0.0, (accumulator, current) => accumulator + current.Item2).Select(z => (Group: grp.Key, Value: z));
            });



aggSource.Subscribe(x => dictResults[x.Group] = x,
              y => { Console.WriteLine("Error Ocurred: " + y.Message); completed = true; },
              () => { completed = true; Console.WriteLine("Subcription comnpleted"); }
              );
// dict results is dictionary which is my projection which is shown to View. Right now my view is just console window.

持续时间选择器控制连接窗口重叠-当其中一个源完成时,我们需要缩短重叠。首先,我们将使用LastOrDefaultAsync在发出OnComplete时获取通知

var either = Observable.CombineLatest(l.LastOrDefaultAsync(), r.LastOrDefaultAsync());
现在,我们可以从示例中修改持续时间选择器:

var q = r.GroupJoin(l,
                _ => Observable.Never<Unit>().TakeUntil(either), // windows from each left event until l or r completes
                _ => Observable.Never<Unit>().TakeUntil(either), // windows from each right event until l or r completes
                (left, obsOfRight) => Tuple.Create(left, obsOfRight)); // create tuple of left event with observable of right events

这将导致级联并完成可观察管道的其余部分。

因为源的类型不同。我必须通过联合测试的结果选择器。除此之外,它还很有魅力,谢谢!!