Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.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# 在一个时间间隔内触发两个具有先决条件的事件时订阅_C#_System.reactive - Fatal编程技术网

C# 在一个时间间隔内触发两个具有先决条件的事件时订阅

C# 在一个时间间隔内触发两个具有先决条件的事件时订阅,c#,system.reactive,C#,System.reactive,我有一件事。 我只想在值>5,后跟值 ev.Value > 0.5).Take(1); var down = data.SkipUntil(up).Where(ev => ev.Value < -0.5).Take(1); down.Subscribe(ar => { Console.WriteLine("OK"); }); IObservable data=Observable.FromEventPattern ev.Value>0.5)。取(1); var向下=数据SkipUn

我有一件事。 我只想在值>5,后跟值<-5,并且两者都在5秒内触发时使用Rx订阅

我已经设法创建了一个与值条件一起工作的可观察对象。 我怎样才能检查他们是否在5秒内开火

这是我的密码:


IObservable<MyEventArgs> data = Observable.FromEventPattern<...

var up = data.Where(ev => ev.Value > 0.5).Take(1);
var down = data.SkipUntil(up).Where(ev => ev.Value < -0.5).Take(1);

down.Subscribe(ar => { Console.WriteLine("OK"); });


IObservable data=Observable.FromEventPattern ev.Value>0.5)。取(1);
var向下=数据SkipUntil(向上)。其中(ev=>ev.值<-0.5)。取(1);
Subscribe(ar=>{Console.WriteLine(“OK”);});
[编辑]: 这是一个代表我的输入数据和预期结果何时出现的图像

[编辑]: 还有一件事:

我为什么要这个?;-) 我正在尝试使用WP7加速计来检测在“n”秒内发生的向上/向下移动,并导致至少0,5G(向上)和小于-0,5G(向下)

谢谢, 巴特克

这个怎么样:

data.TimeStamp(anAppropriateSchedulerPerhapsDispatcherSchedulerOrTaskPool)
    .Buffer(2 /*items*/, /*advance by*/ 1)
    .Where(x => x[0].Value > 5 && x[1].Value < -5 && 
        x[1].Timestamp - x[0].Timestamp < TimeSpan.FromSeconds(5));
    .Subscribe(x => Console.WriteLine("Found it!"));
data.TimeStamp(适当的调度程序或调度程序调度程序或任务池)
.缓冲区(2/*项*/,/*预付款*/1)
。其中(x=>x[0]。值>5&&x[1]。值<-5&&
x[1]。时间戳-x[0]。时间戳Console.WriteLine(“找到了!”);

您正在寻找的是
Join
操作符

根据您的图形,我假设您希望窗口从第一个连续的高值或低值开始具有固定的持续时间。
RisingEdges
函数(我能在短时间内想到的最佳名称)将可观察到的源过滤到这些第一个连续值

<Extension()>
Public Function RisingEdges(Of T)(source As IObservable(Of T),
                                  level As Func(Of T, Boolean)
                                 ) As IObservable(Of T)
    Return source.Select(Function(v) Tuple.Create(v, level(v))) _
                 .DistinctUntilChanged(Function(vb) vb.Item2) _
                 .Where(Function(vb) vb.Item2) _
                 .Select(Function(vb) vb.Item1)
End Function
注意不要将此函数用于冷观测,因为将有两个订阅。根据来源的不同,这可能是可以接受的,或者您可能需要使用
Publish
将其设置为“热”

我不完全清楚最终结果是什么,但这很有希望让您接近您想要的结果。

根据上面指定的“向上”和“向下”,下面的代码如何:

  var  updown=down.Zip(up,(d,u)=> d).Timeout( TimeSpan.FromSeconds( 5 ) ).Retry();
  updown.Subscribe( ar => { Console.WriteLine( "OK" ); } );

我还没有测试过这个,但也许值得尝试一下。

我认为Rx应该让事件变得更容易:-/谢谢,如果它对meI有效,我会尝试添加一个可以解释我问题的图像。我认为你的解决方案不适用于此。一旦你和图书馆成为一家人,这肯定会让你的生活更轻松。我确实认为上面的代码解决了你的问题。@Christoph这个问题实际上比他现在指定的更难解决-当前的代码不起作用,因为它在-5旁边寻找一个5。这基本上意味着对于每一个产生<-5的项目,你必须为项目的最后5秒保留一个窗口。为什么它不会增加TimeoutException?这是因为Retry()?是的,这是因为Retry()而发生的,在重试之后,一切都从头开始。但请不要以为这个解决方案只适用于热观测!
  var  updown=down.Zip(up,(d,u)=> d).Timeout( TimeSpan.FromSeconds( 5 ) ).Retry();
  updown.Subscribe( ar => { Console.WriteLine( "OK" ); } );