System.reactive 如何匹配两个因果流中的事件以检测过度滞后

System.reactive 如何匹配两个因果流中的事件以检测过度滞后,system.reactive,System.reactive,我有两个热门观察对象,分别是对网络服务器的请求流Q,以及来自服务器的回复流R。回复总是按照请求的顺序发送,每个请求最终只会收到一个回复。因此,R,R1中的第一个事件是对Q,Q1中的第一个事件的回复,依此类推。我需要检测回复Rn何时花费的时间超过定义的超时,并发出此超时条件的信号 Q --1---2---------3-------> // Requests Q1, Q2... R ----1-------------------> // Replies Out -----

我有两个热门观察对象,分别是对网络服务器的请求流
Q
,以及来自服务器的回复流
R
。回复总是按照请求的顺序发送,每个请求最终只会收到一个回复。因此,
R
,R1中的第一个事件是对
Q
,Q1中的第一个事件的回复,依此类推。我需要检测回复Rn何时花费的时间超过定义的超时,并发出此超时条件的信号

  Q --1---2---------3------->  // Requests Q1, Q2...
  R ----1------------------->  // Replies
Out ------------------O-|>     // Oops: Reply R2 to Q2 did not arrive within time τ.
          |<----τ---->|

我相信您希望得到通知,请求4已超时(到期时间为3s,但到达时间为3.2s),并且请求5从未到达

void Main()
{
var scheduler=newtestscheduler();
var requests=scheduler.CreateHotObservable(
ReactiveTest.OnNext(0500.Ms(),1),
ReactiveTest.OnNext(1000.Ms(),2),
ReactiveTest.OnNext(1500.Ms(),3),
ReactiveTest.OnNext(2000.Ms(),4),
ReactiveTest.OnNext(2500.Ms(),5));
var responses=scheduler.CreateHotObservable(
ReactiveTest.OnNext(0950.Ms(),Unit.Default),
ReactiveTest.OnNext(1700.Ms(),Unit.Default),
ReactiveTest.OnNext(2450.Ms(),Unit.Default),
OnNext(3200.Ms(),Unit.Default));
var expected=scheduler.CreateHotObservable(
ReactiveTest.OnNext(3000.Ms(),4),
ReactiveTest.OnNext(3500.Ms(),5)
);
var observer=scheduler.CreateObserver();
var查询=响应
.选择((val,idx)=>idx)
.Publish(responseIdxs=>
{
返回请求。选择many((q,qIdx)=>
可观察计时器(TimeSpan.FromSeconds(1),调度程序)
.TakeUntil(responseIdxs.Where(rIdx=>qIdx==rIdx))
.选择(=>q));
});
查询、订阅(观察员);
scheduler.Start();
//这个测试通过了
ReactiveAssert.AreElementsEqual(
预期。消息,
观察员(信息);
}
//在此处定义其他方法和类
公共静态类ticketxtensions
{
公共静态长毫秒(此整数毫秒)
{
返回TimeSpan.From毫秒(ms).Ticks;
}
}

他说qn或rn没有标识,所以不能使用q==r。您必须按索引进行匹配(在请求中使用indexed SelectMany,然后使用index跳过响应),或者欺骗并在某处添加标识符。但他还声明响应将始终有序,因此条件检查是有效的。。。对于我的示例数据。但是是的,如果您将整数切换到
单位,他可以从
选择
切换到使用索引。默认值
,就像问题一样,测试失败。如果您有
{q1@0, q2@500, r1@800, r2@2000}
,并使用
单位。默认情况下,
,您的代码将通过它,因为
单元
返回了
r1@800
将同时满足
q1
q2
的要求,但它只应满足
q1