public Task <OpcDaItemValue[]> Start(IList <OpcDaItem> items, CancellationToken token)
        {
            try
            {
                var serverHandles = ArrayHelpers.GetServerHandles(items);

                HRESULT[] ppErrors;
                int       cancelId = _asyncIO2.Read(serverHandles, TransactionId, out ppErrors);

                if (ppErrors.All(e => e.Failed)) // if all errors no callback will take place
                {
                    _requestManager.CompleteRequest(TransactionId);
                    var result = new OpcDaItemValue[ppErrors.Length];
                    for (var i = 0; i < result.Length; i++)
                    {
                        result[i] = new OpcDaItemValue {
                            Error = ppErrors[i], Item = items[i]
                        };
                    }
                    _tcs.SetResult(result);
                }
                else
                {
                    CancellationId = cancelId;
                    RequestHelpers.SetCancellationHandler(token, Cancel);
                }

                return(Task);
            }
            catch (Exception ex)
            {
                _requestManager.CompleteRequest(TransactionId);
                _tcs.SetException(ex);
                return(Task);
            }
        }