Пример #1
0
        private async ValueTask <bool> ReadInnerAsync(DataBlob blob, CancellationToken token, bool @lock)
        {
            if (blob is null)
            {
                throw new ArgumentException(SR.NullArgument, nameof(blob));
            }

            if (@lock)
            // Synchronizing read access
            {
                await Semaphore.WaitAsync(token);
            }

            try
            {
                if (NBytesAvailable < DataBlob.SizeInBytes)
                {
                    //var n = await _stream.ReadAsync(_buffer, _nAvailableBytes, _buffer.Length - _nAvailableBytes, token);
                    await ReadIntoBuffer(NBytesAvailable, Buffer.Length - NBytesAvailable, token, false);

                    if (NBytesAvailable < DataBlob.SizeInBytes)
                    {
                        return(false);
                    }
                }

                if (blob.IsInitialized)
                {
                    blob.Reset();
                }

                if (!blob.TryInitialize(Span.Slice(0, DataBlob.SizeInBytes)))
                {
                    return(false);
                }
                CompactBuffer(DataBlob.SizeInBytes);

                return(true);
            }
            finally
            {
                if (@lock)
                {
                    Semaphore.Release();
                }
            }
        }
Пример #2
0
 public ValueTask <bool> WriteAsync(DataBlob blob, CancellationToken token = default)
 => WriteInnerAsync(blob, token, true);