DLL with DataAccess SDK C#

Hi there,
I am able to run the c# DataApiUsageExampleRealtimeData as a console application all right.

Now that I need the Eikon Data API within a DLL.I have referenced the "ThomsonReuters.Desktop.SDK.DataAccess.dll" and the other UDAP dll alright.

I cannot get any events to fire for

DataReceivedCallbackInit

after this code runs without any issues:

                subscription =
realtime.SetupDataSubscription()
.WithRics("EUR=")
.WithFields("BID", "ASK", "TIMACT")
.WithDateAndTimeMode(TimeAndDateMode.GMT)
.OnDataUpdated(DataReceivedCallbackInit)
.CreateAndStart();

I believe it has something to do with the threading model:

private static readonly DispatcherFrame Frame = new DispatcherFrame(); 

Any idea on how I can achieve this kind of threading within the DLL I am trying to code?
Do I need to put the above code into a new thread?

Thanks for support,

Michael

Best Answer

Answers

  • I found a way how to do it. If anybody is interested, here you go:

    private DispatcherFrame frame;

    /// <summary>
    ///
    /// </summary>
    public Eikon()

    {

    new Thread(p => OnConnectInternal())
    {
    IsBackground = true
    }
    .Start();
    }
    private void OnConnectInternal()
    {
    frame = new DispatcherFrame();

    DataServices.Instance.StateChanged += Instance_StateChanged;

    DataServices.Instance.Initialize("DataApiUsageExampleRealtimeData2");

    var realtime = DataServices.Instance.Realtime;

    subscription =
    realtime.SetupDataSubscription()
    .WithRics("EUR=")
    .WithFields("BID", "ASK", "TIMACT")
    .WithDateAndTimeMode(TimeAndDateMode.GMT)
    .OnDataUpdated(DataReceivedCallbackInit)
    .CreateAndStart();

    Dispatcher.PushFrame(frame);
    }

    private void Instance_StateChanged(object sender, DataServicesStateChangedEventArgs e)
    {
    switch (e.State)
    {
    case DataServicesState.None:
    break;
    case DataServicesState.Error:
    break;
    case DataServicesState.Up:
    break;
    case DataServicesState.Down:
    break;
    case DataServicesState.LocalMode:
    break;
    case DataServicesState.EikonClosing:
    break;
    case DataServicesState.EikonStarting:
    break;
    default:
    throw new ArgumentOutOfRangeException();
    }
    }

    protected void DataReceivedCallbackInit(IRealtimeUpdateDictionary instruments)
    {

    try
    {
    foreach (var ins in instruments)
    {
    foreach (var kvp in ins.Value)
    {
    switch (kvp.Key)
    {
    case "BID":
    break;
    case "ASK":
    break;
    default:
    break;
    }
    break;
    }
    }
    }
    catch (Exception ex)
    {

    }
    }
  • @tt1057, thanks for sharing :-)