0

我已经工作StreamInsight了几个星期了,通常让它做我想做的事,但有一个例外。我不能让多个查询在同一个进程中运行。例如,假设eventStreamIQStreamable<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 个查询,通知同一进程中的不同观察者?

4

2 回答 2

0

您是否运行过跟踪以查看发生了什么?对于您的查询,没有什么可以立即让我觉得不正确,它应该可以毫无问题地工作。但是,请记住,Console.WriteLine 是静态的、单线程的,并不是真正“查看”所有正在发生的事件的最准确方式。很可能是事件已发送,但由于锁定而被观察者丢弃。

于 2015-04-10T14:02:47.213 回答
0

@DevBiker,感谢您对 trace.cmd 的提醒 - 它让我看到了问题,即每个查询只接收流中的一半事件。这是我的Observable<T>源中的一个问题,它从 Azure 主题接收事件。我没有意识到.With扩展创建了两个 source 实例Observable<T>。每个源都从 the 获取订阅 ID,app.config因此每个源Observable都有一个SubscriptionClient具有相同订阅 ID 的实例。这意味着每个实例SubscriptionClient都接收到一半的事件。

于 2015-04-14T11:15:48.713 回答