我已经和StreamInsight
一起工作了几个星期,并且通常会让它做我想要它做的一个例外。我无法在同一进程中运行多个查询。例如,鉴于eventStream
是IQStreamable<eventClass>
:
var query1 = from e in eventStream
where e.EventCode == "33"
select e;
var query2 = from e in eventStream
where e.EventCode == "1"
select e;
var query1Observable = from e in query1.ToPointObservable()
where e.EventKind == EventKind.Insert
select e.Payload.EventCode + ": " + e.Payload.EventDescription;
var query2Observable = from e in query2.ToPointObservable()
where e.EventKind == EventKind.Insert
select e.Payload.EventCode + ": " + e.Payload.EventDescription;
var query1Observer = myApp.DefineObserver(() => Observer.Create<string>(Console.WriteLine));
var query2Observer = myApp.DefineObserver(() => Observer.Create<string>(Console.WriteLine));
var binding = query1Observable.Bind(query1Observer).With(query2Observable.Bind(query2Observer));
using (binding.Run())
{
System.Console.WriteLine("Press enter to stop at any time.");
System.Console.ReadLine();
}
当此运行时,只有大约一半的query1事件被发送到query1Observer
,并且只有大约一半的query2事件被发送到query2Observer
。其他人就消失了。如果我只是制作我的装订
query1Observable.Bind(query1Observer)
然后将所有查询的结果通知给观察者 - 但当然只针对query1。如何运行2个查询,在同一过程中通知不同的观察者?
答案 0 :(得分:0)
你有没有看到发生了什么?没有什么可以立即让我觉得你的查询不正确,它应该没有问题。但是,请记住,Console.WriteLine是静态的,单线程的,并不是最准确的方式来真正地看到&#34;所有正在发生的事件。很可能事件是发送的,但由于锁定而被观察者丢弃。
答案 1 :(得分:0)
@DevBiker,感谢您对trace.cmd的提醒 - 它让我看到了问题,即每个查询只接收流中一半的事件。这是我的Observable<T>
来源中的问题,该来源正在从Azure主题接收事件。我没有意识到,.With
扩展名会创建两个源Observable<T>
的实例。每个来源都从app.config
获取订阅ID,因此每个Observable
都有一个具有相同订阅ID的SubscriptionClient
实例。这意味着SubscriptionClient
的每个实例都接收了一半的事件。