我有一个看起来如下的对象:
public class Message {
public string Topic { get; set; }
public string ContextId { get; set; }
...
}
有问题的observable被用作消息总线,我想让“观察者”说出主题为a
的消息何时发生,然后主题b
出现同一{{1}做ContextId
。
你有什么想法会这样做吗?此外,如果这样做会产生任何负面影响(即内存会被阻止,某个特定主题的消息对之一不会发生),是否可以防范这种情况?
答案 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()
,您就会得到回忆。