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); } }