private void InternalExecuteQueryAsync(AseCommand command, AseTransaction transaction, TaskCompletionSource <DbDataReader> readerSource, CommandBehavior behavior) { AssertExecutionStart(); #if ENABLE_SYSTEM_DATA_COMMON_EXTENSIONS var dataReader = new AseDataReader(command, behavior, EventNotifier); #else var dataReader = new AseDataReader(behavior, EventNotifier); #endif try { SendPacket(new NormalPacket(BuildCommandTokens(command, behavior))); var envChangeTokenHandler = new EnvChangeTokenHandler(_environment, _parameters.Charset); var doneHandler = new DoneTokenHandler(); var dataReaderHandler = new StreamingDataReaderTokenHandler(readerSource, dataReader, EventNotifier); var responseParameterTokenHandler = new ResponseParameterTokenHandler(command.AseParameters); Logger.Instance?.WriteLine(); Logger.Instance?.WriteLine("---------- Receive Tokens ----------"); try { #if ENABLE_ARRAY_POOL using (var tokenStream = new TokenReceiveStream(_networkStream, _environment, _arrayPool)) #else using (var tokenStream = new TokenReceiveStream(_networkStream, _environment)) #endif { foreach (var receivedToken in _reader.Read(tokenStream, _environment)) { if (envChangeTokenHandler.CanHandle(receivedToken.Type)) { envChangeTokenHandler.Handle(receivedToken); } if (doneHandler.CanHandle(receivedToken.Type)) { doneHandler.Handle(receivedToken); } if (dataReaderHandler.CanHandle(receivedToken.Type)) { dataReaderHandler.Handle(receivedToken); } if (responseParameterTokenHandler.CanHandle(receivedToken.Type)) { responseParameterTokenHandler.Handle(receivedToken); } } } } finally { LastActive = DateTime.UtcNow; } // This tells the data reader to stop waiting for more results. dataReader.CompleteAdding(); AssertExecutionCompletion(doneHandler); if (transaction != null && doneHandler.TransactionState == TranState.TDS_TRAN_ABORT) { transaction.MarkAborted(); } dataReaderHandler.AssertNoErrors(); if (doneHandler.Canceled) { readerSource.TrySetCanceled(); // If we have already begun returning data, then this will get lost. } else { readerSource.TrySetResult(dataReader); // Catchall - covers cases where no data is returned by the server. } } catch (Exception ex) { // If we have already begun returning data, then this will get lost. if (!readerSource.TrySetException(ex)) { throw; } } }