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(); } } }
public ValueTask <bool> WriteAsync(DataBlob blob, CancellationToken token = default) => WriteInnerAsync(blob, token, true);