/// <summary>
        ///     Returns id actully used for OPC subscription, always as original id.
        ///     valueSubscription.Update() is called using сallbackDoer, see Initialize(..).
        /// </summary>
        /// <param name="elementId"></param>
        /// <param name="valueSubscription"></param>
        public void AddItem(string?elementId, IValueSubscription valueSubscription)
        {
            //Logger?.LogDebug("XiDataProvider.AddItem() " + elementId);

            if (String.IsNullOrEmpty(elementId))
            {
                var callbackDispatcher = CallbackDispatcher;
                if (callbackDispatcher is not null)
                {
                    try
                    {
                        callbackDispatcher.BeginInvoke(ct =>
                                                       valueSubscription.Update(new ValueStatusTimestamp {
                            ValueStatusCode = ValueStatusCode.ItemDoesNotExist
                        }));
                    }
                    catch (Exception)
                    {
                    }
                }

                return;
            }

            var valueSubscriptionObj = new ValueSubscriptionObj(elementId, valueSubscription);

            _valueSubscriptionsCollection.Add(valueSubscription, valueSubscriptionObj);

            if (IsInitialized)
            {
                valueSubscription.MappedElementIdOrConst = AddItem(valueSubscriptionObj);
            }
        }
        /// <summary>
        ///     If valueSubscription is not subscribed - does nothing.
        /// </summary>
        /// <param name="valueSubscription"></param>
        public void RemoveItem(IValueSubscription valueSubscription)
        {
            if (!_valueSubscriptionsCollection.Remove(valueSubscription, out ValueSubscriptionObj? valueSubscriptionObj))
            {
                return;
            }

            if (IsInitialized)
            {
                RemoveItem(valueSubscriptionObj);
            }
        }
 /// <summary>
 ///
 /// </summary>
 /// <param name="valueSubscription"></param>
 /// <param name="valueStatusTimestamp"></param>
 /// <param name="userFriendlyLogger"></param>
 public void Write(IValueSubscription valueSubscription, ValueStatusTimestamp valueStatusTimestamp, ILogger?userFriendlyLogger)
 {
     BeginInvoke(ct =>
     {
         if (_xiServerProxy is null)
         {
             throw new InvalidOperationException();
         }
         _xiDataListItemsManager.Subscribe(_xiServerProxy, CallbackDispatcher,
                                           XiDataListItemsManagerOnElementValuesCallback, true, ct);
         _xiDataListItemsManager.Write(valueSubscription, valueStatusTimestamp);
     });
 }