public Task<HRESULT[]> Start(IList<OpcDaItem> items, OPCITEMVQT[] vqt, CancellationToken token)
        {
            try
            {
                var serverHandles = ArrayHelpers.GetServerHandles(items);
                HRESULT[] ppErrors;
                int cancelId = _asyncIO3.WriteVQT(serverHandles, vqt, TransactionId, out ppErrors);

                if (ppErrors.All(e => e.Failed)) // if all errors no callback will take place
                {
                    _requestManager.CompleteRequest(TransactionId);
                    _tcs.SetResult(ppErrors);
                }
                else
                {
                    CancellationId = cancelId;
                    RequestHelpers.SetCancellationHandler(token, Cancel);
                }

                return Task;
            }
            catch (Exception ex)
            {
                _requestManager.CompleteRequest(TransactionId);
                _tcs.SetException(ex);
                return Task;
            }
        }
        public HRESULT[] WriteVQT(IList<string> itemIds, IList<OpcDaVQT> values)
        {
            if (itemIds.Count != values.Count)
                throw new ArgumentException("Invalid size of values", "values");

            var vqts = new OPCITEMVQT[values.Count];
            for (int i = 0; i < values.Count; i++)
            {
                OpcDaVQT opcItemValue = values[i];
                vqts[i].bQualitySpecified = false;
                if (opcItemValue.Quality != short.MinValue)
                {
                    vqts[i].bQualitySpecified = true;
                    vqts[i].wQuality = opcItemValue.Quality;
                }

                vqts[i].bTimeStampSpecified = false;
                if (opcItemValue.Timestamp != DateTimeOffset.MinValue)
                {
                    vqts[i].bTimeStampSpecified = true;
                    vqts[i].ftTimeStamp = FileTimeConverter.ToFileTime(opcItemValue.Timestamp);
                }

                vqts[i].vDataValue = opcItemValue.Value;
            }

            string[] pszItemIDs = itemIds.ToArray();
            var ppErrors = new HRESULT[pszItemIDs.Length];
            DoComCall(ComObject, "IOPCItemIO::WriteVQT",
                () => ComObject.WriteVQT(pszItemIDs.Length, pszItemIDs, vqts, out ppErrors), pszItemIDs.Length, pszItemIDs);
            return ppErrors;
        }
 public HRESULT[] WriteVQT(int[] serverHandles, OPCITEMVQT[] vqts)
 {
     return DoComCall(ComObject, "IOpcSyncIO2::WriteVQT", () =>
     {
         HRESULT[] ppErrors;
         ComObject.WriteVQT(serverHandles.Length, serverHandles, vqts, out ppErrors);
         return ppErrors;
     }, serverHandles.Length, serverHandles, vqts);
 }
        public static OPCITEMVQT[] CreateOpcItemVQT(IList<OpcDaVQT> values)
        {
            var vqts = new OPCITEMVQT[values.Count];
            for (int i = 0; i < values.Count; i++)
            {
                OpcDaVQT value = values[i];
                vqts[i].bQualitySpecified = false;
                if (value.Quality != short.MinValue)
                {
                    vqts[i].bQualitySpecified = true;
                    vqts[i].wQuality = value.Quality;
                }

                vqts[i].bTimeStampSpecified = false;
                if (value.Timestamp != DateTimeOffset.MinValue)
                {
                    vqts[i].bTimeStampSpecified = true;
                    vqts[i].ftTimeStamp = FileTimeConverter.ToFileTime(value.Timestamp);
                }

                vqts[i].vDataValue = value.Value;
            }
            return vqts;
        }
 public int WriteVQT(int[] serverHandles, OPCITEMVQT[] vqts, int transactionId, out HRESULT[] errors)
 {
     var _errors = new HRESULT[serverHandles.Length];
     int result = DoComCall(ComObject, "IOpcAsyncIO3::WriteVQT", () =>
     {
         int dwCancelId;
         ComObject.WriteVQT(serverHandles.Length, serverHandles, vqts, transactionId, out dwCancelId, out _errors);
         return dwCancelId;
     }, serverHandles, vqts, transactionId);
     errors = _errors;
     return result;
 }