private async Task <bool> FindNextDelimiter(Func <DataType, object, DataAdditionResult> dataAction)
        {
            var dataAdditionResult = new DataAdditionResult(DataType.ASCIILine, -1);

            while (true)
            {
                if (dataAdditionResult.NextDataType == DataType.ASCIILine)
                {
                    string line;
                    if ((line = await ReadASCIILineAsync()) == null)
                    {
                        return(false);
                    }
                    if (line.StartsWith(DataSetDelimiter, StringComparison.InvariantCultureIgnoreCase))
                    {
                        return(true);
                    }
                    dataAdditionResult = dataAction(dataAdditionResult.NextDataType, line);
                    continue;
                }

                if (dataAdditionResult.NextDataType == DataType.BinaryData)
                {
                    dataAdditionResult = await ProcessBinaryData(dataAdditionResult, dataAction);

                    continue;
                }

                return(false);
            }
        }
        private async Task <DataAdditionResult> ProcessBinaryData(DataAdditionResult previousDataAdditionResult, Func <DataType, object, DataAdditionResult> dataAction)
        {
            var byteBuffer = new byte[previousDataAdditionResult.NextDataLength];

            if (await ReadBytesAsync(byteBuffer, 0, byteBuffer.Length) < byteBuffer.Length)
            {
                throw new InvalidDataException("Stream is ended before all bytes could be read.");
            }

            return(dataAction(previousDataAdditionResult.NextDataType, byteBuffer));
        }