question

Upvotes
Accepted
65 3 3 9

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

eikoneikon-data-apipythonworkspacerefinitiv-dataplatform-eikonworkspace-data-apic#sdkmulti-threading
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Upvotes
Accepted
39.4k 78 11 27

@tt1057
Please make sure that Windows message pump is running on the thread housing Eikon .NET API objects. See this thread for more details.

icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Upvote
65 3 3 9

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)
            {
            
            }
        }

icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

@tt1057, thanks for sharing :-)

Write an Answer

Hint: Notify or tag a user in this post by typing @username.

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.