/// <summary>
        ///     Asynchronously refreshes all active group items (whether they have changed or not). Inactive items are not included
        ///     in the callback.
        /// </summary>
        /// <param name="dataSource">The data source either cache or device.</param>
        /// <param name="token">The task cancellation token.</param>
        /// <returns>
        ///     The values of the group items.
        /// </returns>
        public Task <OpcDaItemValue[]> RefreshAsync(OpcDaDataSource dataSource, CancellationToken token)
        {
            CheckSupported(OpcDaGroupFeatures.RefreshAsync);

            var request = new RefreshAsyncRequest(As <OpcAsyncIO2>());

            _asyncRequestManager.AddRequest(request);
            return(request.Start(dataSource, token));
        }
        /// <summary>
        ///     Reads the specified group items.
        /// </summary>
        /// <param name="items">The group items.</param>
        /// <param name="dataSource">The data source.</param>
        /// <returns>
        ///     The values of the group items.
        /// </returns>
        public OpcDaItemValue[] Read(IList <OpcDaItem> items, OpcDaDataSource dataSource = OpcDaDataSource.Cache)
        {
            CheckItems(items);
            CheckSupported(OpcDaGroupFeatures.Read);
            int[] serverHandles = ArrayHelpers.GetServerHandles(items);

            HRESULT[]        ppErrors;
            OPCITEMSTATE[]   ppItemValues = As <OpcSyncIO>().Read((OPCDATASOURCE)dataSource, serverHandles, out ppErrors);
            OpcDaItemValue[] result       = OpcDaItemValue.Create(this, ppItemValues, ppErrors);
            OnValuesChanged(new OpcDaItemValuesChangedEventArgs(result));
            return(result);
        }
        public Task<OpcDaItemValue[]> Start(OpcDaDataSource dataSource, CancellationToken token)
        {
            try
            {
                int cancelId = _asyncIO2.Refresh2((OPCDATASOURCE) dataSource, TransactionId);
                CancellationId = cancelId;
                RequestHelpers.SetCancellationHandler(token, Cancel);

                return Task;
            }
            catch (Exception ex)
            {
                _requestManager.CompleteRequest(TransactionId);
                _tcs.SetException(ex);
                return Task;
            }
        }
        public Task <OpcDaItemValue[]> Start(OpcDaDataSource dataSource, CancellationToken token)
        {
            try
            {
                int cancelId = _asyncIO2.Refresh2((OPCDATASOURCE)dataSource, TransactionId);
                CancellationId = cancelId;
                RequestHelpers.SetCancellationHandler(token, Cancel);

                return(Task);
            }
            catch (Exception ex)
            {
                _requestManager.CompleteRequest(TransactionId);
                _tcs.SetException(ex);
                return(Task);
            }
        }
 /// <summary>
 ///     Asynchronously refreshes all active group items (whether they have changed or not). Inactive items are not included
 ///     in the callback.
 /// </summary>
 /// <param name="dataSource">The data source either cache or device.</param>
 /// <returns>
 ///     The values of the group items.
 /// </returns>
 public Task <OpcDaItemValue[]> RefreshAsync(OpcDaDataSource dataSource = OpcDaDataSource.Cache)
 {
     return(RefreshAsync(dataSource, new CancellationToken()));
 }