Example #1
0
 /// <summary>
 ///     Returns null, if incomplete ElementValuesCollection.
 /// </summary>
 /// <param name="dataList"></param>
 /// <param name="elementValuesCollections"></param>
 /// <returns></returns>
 private ClientElementValueListItem[]? ElementValuesCallback(ClientElementValueList dataList, ElementValuesCollection elementValuesCollections)
 {
     ClientElementValueListItem[]? changedListItems = dataList.OnElementValuesCallback(elementValuesCollections);
     if (changedListItems is not null && changedListItems.Length > 0)
     {
         List <ValueStatusTimestamp> changedValuesList = new List <ValueStatusTimestamp>(changedListItems.Length);
         foreach (ClientElementValueListItem changedListItem in changedListItems)
         {
             changedValuesList.Add(changedListItem.ValueStatusTimestamp);
         }
         dataList.RaiseElementValuesCallbackEvent(changedListItems, changedValuesList.ToArray());
     }
     return(changedListItems);
 }
Example #2
0
        /// <summary>
        /// </summary>
        /// <param name="tagValueList"></param>
        /// <returns></returns>
        public ClientElementValueListItem[] PollElementValuesChanges(ClientElementValueList tagValueList)
        {
            if (_disposed)
            {
                throw new ObjectDisposedException("Cannot access a disposed ClientContext.");
            }

            if (!ServerContextIsOperational)
            {
                throw new InvalidOperationException();
            }

            try
            {
                while (true)
                {
                    var request = new PollElementValuesChangesRequest
                    {
                        ContextId       = _serverContextId,
                        ListServerAlias = tagValueList.ListServerAlias
                    };
                    PollElementValuesChangesReply reply = _resourceManagementClient.PollElementValuesChanges(request);
                    SetResourceManagementLastCallUtc();

                    var changedItems = ElementValuesCallback(tagValueList, reply.ElementValuesCollection);
                    if (changedItems is not null)
                    {
                        return(changedItems);
                    }
                }
            }
            catch (Exception ex)
            {
                ProcessRemoteMethodCallException(ex);
                throw;
            }
        }
Example #3
0
        private async Task ReadCallbackMessagesAsync(IAsyncStreamReader <CallbackMessage> reader, CancellationToken cancellationToken)
        {
            while (true)
            {
                if (!_serverContextIsOperational || cancellationToken.IsCancellationRequested)
                {
                    return;
                }

                try
                {
                    if (!await reader.MoveNext(cancellationToken))
                    {
                        return;
                    }
                }
                //catch (RpcException e) when (e.StatusCode == StatusCode.NotFound)
                //{
                //    break;
                //}
                //catch (OperationCanceledException)
                //{
                //    break;
                //}
                catch
                {
                    return;
                }

                if (!_serverContextIsOperational || cancellationToken.IsCancellationRequested)
                {
                    return;
                }

                CallbackMessage current = reader.Current;
                _callbackDispatcher.BeginInvoke(ct =>
                {
                    if (ct.IsCancellationRequested)
                    {
                        return;
                    }
                    try
                    {
                        switch (current.OptionalMessageCase)
                        {
                        case CallbackMessage.OptionalMessageOneofCase.ContextInfo:
                            ContextInfo serverContextInfo = current.ContextInfo;
                            ServerContextInfo             = serverContextInfo;
                            break;

                        case CallbackMessage.OptionalMessageOneofCase.ElementValuesCallback:
                            ElementValuesCallback elementValuesCallback = current.ElementValuesCallback;
                            ClientElementValueList datalist             = GetElementValueList(elementValuesCallback.ListClientAlias);
                            ElementValuesCallback(datalist, elementValuesCallback.ElementValuesCollection);
                            break;

                        case CallbackMessage.OptionalMessageOneofCase.EventMessagesCallback:
                            EventMessagesCallback eventMessagesCallback = current.EventMessagesCallback;
                            ClientEventList eventList = GetEventList(eventMessagesCallback.ListClientAlias);
                            EventMessagesCallback(eventList, eventMessagesCallback.EventMessagesCollection);
                            break;

                        case CallbackMessage.OptionalMessageOneofCase.LongrunningPassthroughCallback:
                            LongrunningPassthroughCallback longrunningPassthroughCallback = current.LongrunningPassthroughCallback;
                            LongrunningPassthroughCallback(longrunningPassthroughCallback);
                            break;
                        }
                    }
                    catch (Exception ex)
                    {
                        _logger.LogError(ex, "Callback message exception.");
                    }
                });
            }
        }