/// <summary>
        ///     Asynchronously writes one or more values, qualities and timestamps for the items specified. If a client attempts to
        ///     write VQ, VT, or VQT it should expect that the server will write them all or none at all.
        /// </summary>
        /// <param name="items">The group items.</param>
        /// <param name="values">The list of values, qualities and timestamps.</param>
        /// <param name="token">The task cancellation token.</param>
        /// <returns>
        ///     Array of HRESULTs indicating the success of the individual item Writes.
        /// </returns>
        public Task <HRESULT[]> WriteVQTAsync(IList <OpcDaItem> items, IList <OpcDaVQT> values,
                                              CancellationToken token)
        {
            CheckItems(items);
            CheckSupported(OpcDaGroupFeatures.WriteVQTAsync);

            var request = new WriteVQTAsyncRequest(As <OpcAsyncIO3>());

            _asyncRequestManager.AddRequest(request);
            OPCITEMVQT[] vqts = ArrayHelpers.CreateOpcItemVQT(values);
            return(request.Start(items, vqts, token));
        }
        /// <summary>
        ///     Writes one or more values, qualities and timestamps for the items specified. If a client attempts to write VQ, VT,
        ///     or VQT it should expect that the server will write them all or none at all.
        /// </summary>
        /// <param name="items">The group items.</param>
        /// <param name="values">The list of values, qualities and timestamps.</param>
        /// <returns>
        ///     Array of HRESULTs indicating the success of the individual item Writes.
        /// </returns>
        /// <exception cref="System.ArgumentException">Invalid size of values;values</exception>
        public HRESULT[] WriteVQT(IList <OpcDaItem> items, IList <OpcDaVQT> values)
        {
            CheckSupported(OpcDaGroupFeatures.WriteVQT);
            CheckItems(items);
            int[] serverHandles = ArrayHelpers.GetServerHandles(items);

            if (serverHandles.Length != values.Count)
            {
                throw new ArgumentException("Invalid size of values", "values");
            }

            OPCITEMVQT[] vqts = ArrayHelpers.CreateOpcItemVQT(values);
            return(As <OpcSyncIO2>().WriteVQT(serverHandles, vqts));
        }