System.reactive 在反应式扩展中创建优先级流并忽略第二个流

System.reactive 在反应式扩展中创建优先级流并忽略第二个流,system.reactive,System.reactive,我有两个观测点,它们各自做着不同的事情。我希望第二个流忽略它的输入,如果它们的第一个流在某个时间间隔内收到了一些数据,比如说500毫秒。我该怎么做呢 var s1 = new Subject<string>(); var s2 = new Subject<string>(); s1.Subscribe(x => Debug.Write(x)); //Subscribe something slightly different s2.

我有两个观测点,它们各自做着不同的事情。我希望第二个流忽略它的输入,如果它们的第一个流在某个时间间隔内收到了一些数据,比如说500毫秒。我该怎么做呢

var s1 = new Subject<string>();
var s2 = new Subject<string>();

s1.Subscribe(x => Debug.Write(x));                
//Subscribe something slightly different
s2.Subscribe(x => Debug.WriteLine(x));


s1.OnNext("foo");
Thread.Sleep(500);
s2.OnNext("bar");

/* Expected output:
    * foobar /r/n
    */

s1.OnNext("fizz");
s2.OnNext("buzz");
/* Expected output:
* fizz
*/
var s1=新主题();
var s2=新主题();
s1.Subscribe(x=>Debug.Write(x));
//订阅稍有不同的东西
订阅(x=>Debug.WriteLine(x));
s1.OnNext(“foo”);
睡眠(500);
s2.OnNext(“酒吧”);
/*预期产出:
*foobar/r/n
*/
s1.OnNext(“泡沫”);
s2.OnNext(“嗡嗡声”);
/*预期产出:
*起泡
*/

谢谢

每当
s1
产生一个值时,这将启动计时器。每当计时器运行时,它将从
s2
取消订阅,并在计时器过期时重新订阅:

var delay = TimeSpan.FromMilliseconds(500);
var s2lowPriority = s1
    .Select(_ => Observable.Timer(delay).SelectMany(_ => s2))
    .StartWith(s2)
    .Switch();

s2lowPriority.Subscribe(x => Debug.WriteLine(x));

每当
s1
产生一个值时,这将启动一个计时器。每当计时器运行时,它将从
s2
取消订阅,并在计时器过期时重新订阅:

var delay = TimeSpan.FromMilliseconds(500);
var s2lowPriority = s1
    .Select(_ => Observable.Timer(delay).SelectMany(_ => s2))
    .StartWith(s2)
    .Switch();

s2lowPriority.Subscribe(x => Debug.WriteLine(x));

这是个好办法,这是个好办法。