我有一个对象,看起来像这样:
public class Message {
public string Topic { get; set; }
public string ContextId { get; set; }
...
}
所讨论的可观察对象被用作消息总线,我想允许"观察者"说,当主题为a
的消息发生时,然后主题b
与x
相同的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()
,您将获得您的内存。