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



我有一个对象,看起来像这样:

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

所讨论的可观察对象被用作消息总线,我想允许"观察者"说,当主题为a的消息发生时,然后主题bx相同的ContextId发生。

你知道你会怎么做吗?此外,如果这样做有任何负面影响(即内存将被占用是给定主题的消息对之一没有发生),如果这可以防御?

根据您的实际需要,有很多方法可以做到这一点。从你的问题中并没有清楚地看出具体是什么情况。

我将采取这样的观点,即您希望同时跟踪多个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(),您将获得您的内存。

相关内容

  • 没有找到相关文章

最新更新