Uns*_*ced 5 c# bloomberg blpapi eventqueue
设置了ReferenceDataRequest后,我将它发送到EventQueue
Service refdata = _session.GetService("//blp/refdata");
Request request = refdata.CreateRequest("ReferenceDataRequest");
// append the appropriate symbol and field data to the request
EventQueue eventQueue = new EventQueue();
Guid guid = Guid.NewGuid();
CorrelationID id = new CorrelationID(guid);
_session.SendRequest(request, eventQueue, id);
long _eventWaitTimeout = 60000;
myEvent = eventQueue.NextEvent(_eventWaitTimeout);
Run Code Online (Sandbox Code Playgroud)
通常情况下我可以从队列中获取消息,但我现在遇到的情况是,如果我在应用程序的同一次运行中(通常在第十个左右)发出大量请求,我会看到一个TIMEOUTEventType
if (myEvent.Type == Event.EventType.TIMEOUT)
throw new Exception("Timed Out - need to rethink this strategy");
else
msg = myEvent.GetMessages().First();
Run Code Online (Sandbox Code Playgroud)
这些是在同一个线程上进行的,但是我假设我正在消耗并且不释放的某个地方有某些东西.
有人有任何线索或建议吗?
关于SO对BLP的API的引用并不多,但希望我们可以开始纠正这种情况.
由于您在初始帖子中包含的代码,我只是想分享一些东西。
如果您长时间请求历史盘中数据(这会导致 Bloomberg API 生成许多事件),请不要使用 API 文档中指定的模式,因为它最终可能会使您的应用程序检索所有事件的速度非常慢. 基本上,不要在 Session 对象上调用 NextEvent()!请改用专用的 EventQueue。
而不是这样做:
var cID = new CorrelationID(1);
session.SendRequest(request, cID);
do {
Event eventObj = session.NextEvent();
...
}
Run Code Online (Sandbox Code Playgroud)
做这个:
var cID = new CorrelationID(1);
var eventQueue = new EventQueue();
session.SendRequest(request, eventQueue, cID);
do {
Event eventObj = eventQueue.NextEvent();
...
}
Run Code Online (Sandbox Code Playgroud)
这可能会导致一些性能改进,尽管已知 API 不是特别确定......
我并没有真正抽出时间来解决这个问题,但我们确实找到了解决方法。
根据服务器 API 文档中的一条看似一次性的小评论,我们选择创建第二个会话。一个会话负责静态请求,另一个会话负责实时请求。例如
_marketDataSession.OpenService("//blp/mktdata");
_staticSession.OpenService("//blp/refdata");
Run Code Online (Sandbox Code Playgroud)
这意味着一个会话以订阅模式运行,另一个会话则更加同步 - 我认为正是这种二元性才是我们问题的根源。
自从进行更改以来,我们没有遇到任何问题。