当最终两个或多个给定事件发生在一个Observable do x上时

时间:2015-07-16 06:09:18

标签: c# system.reactive reactive-programming

我有一个看起来如下的对象:

public class Message {
   public string Topic { get; set; }
   public string ContextId { get; set; }
   ...
}

有问题的observable被用作消息总线,我想让“观察者”说出主题为a的消息何时发生,然后主题b出现同一{{1}做ContextId

你有什么想法会这样做吗?此外,如果这样做会产生任何负面影响(即内存会被阻止,某个特定主题的消息对之一不会发生),是否可以防范这种情况?

1 个答案:

答案 0 :(得分:1)

根据您的真实需要,有很多方法可以做到这一点。你的问题并不清楚究竟是什么情况。

我将在ContextId出现后跟.Topic == "a"的下一个值显示的情况下,同时跟踪多个ContextId的视图一个.Topic == "b"。这意味着在两条消息之间可能出现任何数量的其他ContextId值的消息。如果不是这种情况,请告诉我。

var query =
    messages
        .GroupBy(x => x.ContextId)
        .Select(xs =>
            xs
                .Publish(ys =>
                    ys
                        .Where(y => y.Topic == "A")
                        .Select(y =>
                            ys
                                .Where(w => w.Topic == "B")
                                .TakeUntil(ys.Where(w => w.Topic != "B")))
                        .Switch()))
        .Merge();

我的测试数据是:

messages.OnNext(new Message() { ContextId = "1", Topic = "A" });
messages.OnNext(new Message() { ContextId = "2", Topic = "B" });
messages.OnNext(new Message() { ContextId = "3", Topic = "C" });
messages.OnNext(new Message() { ContextId = "2", Topic = "A" });
messages.OnNext(new Message() { ContextId = "1", Topic = "B" });
messages.OnNext(new Message() { ContextId = "2", Topic = "C" });
messages.OnNext(new Message() { ContextId = "2", Topic = "B" });

我只从中获得一个值Message() { ContextId = "1", Topic = "B" }

就内存而言,如果出现足够的ContextId值,这将最终耗尽计算机上的所有内存。当然必须。但知道在代码中测量它的唯一方法就是。

请记住,一旦您在订阅上致电.Dispose(),您就会得到回忆。