/// <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); }
/// <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; } }
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."); } }); } }