内容目录
Reusable Stream
You need to install Microsoft.IO.RecyclableMemoryStream
.
internal class StreamHandler
{
// Stream pool
private static readonly RecyclableMemoryStreamManager Manager = new();
private readonly RecyclableMemoryStream _stream;
private volatile bool _disposed;
public Stream Stream => _stream;
public ResponseHandler()
{
_stream = (Manager.GetStream() as RecyclableMemoryStream)!;
}
public ReadOnlySequence<byte> GetReadOnlySequence() => _stream.GetReadOnlySequence();
public void Dispose()
{
if (_disposed) return;
_disposed = true;
_stream.Dispose();
GC.SuppressFinalize(this);
}
public ValueTask DisposeAsync()
{
if (_disposed) return ValueTask.CompletedTask;
_disposed = true;
return _stream.DisposeAsync();
}
public ValueTask InvokeAsync()
{
return ValueTask.CompletedTask;
}
~ResponseHandler()
{
Dispose();
}
}
PipeReader and PipeWriter
You need to include System.IO.Pipelines
.
It provides a more convenient way to work with byte arrays.
Stream stream = .... ....
ReadOnlySequence<byte> sequence;
PipeReader pipeReader = PipeReader.Create(stream, new StreamPipeReaderOptions(bufferSize: Environment.SystemPageSize));
var result = await pipeReader.ReadAsync();
sequence = result.Buffer;
var ex = new Exception();
if (pipeReader != null)
{
await pipeReader.CompleteAsync(ex);
}
文章评论