我有多个(2-10)个热可观察对象,每个在给定的时间窗口内触发一个事件,但不是按顺序。
假设我有 3 个主题,为了说明这一点,它们按任意顺序触发:
Subjects: sA, sB, sC
Order of time window 1:
sB, then sA, then sC
Order of time window 2:
sA, then sC, then sB
Order of time window 3:
sA, then sB, then sC
etc.
因此,如果我要进行合并,我会得到以下流:sB、sA、sC、sA、sC、sB、sA、sB、sC 等。
现在,这是我的问题:我想强制每个时间窗口内的事件顺序。
1. sA
2. sB
3. sC
这将导致以下合并流:sA、sB、sC、sA、sB、sC、sA、sB、sC 等。
窗口时间本身是未知的,但是由于每个事件在每个窗口中只触发一次,我们可以假设一旦所有对象都触发了窗口,窗口就会关闭并打开一个新窗口。
任何想法如何优雅地做到这一点?
扩展问题(不那么重要):可观察对象彼此独立,因此我需要引入一个通用的静态方法,我可以在其中同步每个可观察对象的顺序。
public static IObservable<T> SynchronizeOrder<T>(IObservable<T> source, int order)
{
//return synchronized source
}
更新:我最初的问题中不清楚的是,可观察对象可以是不同的事件类型(这就是我在示例中没有使用特定事件数据类型的原因),因此我不想合并有序的可观察对象. 我想有一种机制,我可以确保独立的可观察对象按它们的顺序同步。
myEventStream
.ObserveOn(TaskFactory)
.DoSomeExpensiveComputation()
.Order(2) //doesn't have to be an extension method
.Subscibe(computationResult=>
sharedRessourceWhereOrderMatters.Update(computationResult))