@@ -460,23 +460,31 @@ public override void Write(Stream stream, ReadOnlyMemory<byte> value)
460
460
461
461
public override Task WriteAsync ( Stream stream , ReadOnlySpan < char > value , CancellationToken token = default )
462
462
{
463
+ // encode the span into a buffer; this should never fail, so if it does: something
464
+ // is very very ill; don't stress about returning to the pool
463
465
byte [ ] bytes = BufferPool . GetBuffer ( Encoding . UTF8 . GetMaxByteCount ( value . Length ) ) ;
466
+ var chars = value . ToArray ( ) ;
467
+ int bytesCount = Encoding . UTF8 . GetBytes ( chars , 0 , chars . Length , bytes , 0 ) ;
468
+ // now do the write async - this returns to the pool
469
+ return WriteAsyncAndReturn ( stream , bytes , 0 , bytesCount , token ) ;
470
+ }
471
+
472
+ private static async Task WriteAsyncAndReturn ( Stream stream , byte [ ] bytes , int offset , int count , CancellationToken token )
473
+ {
464
474
try
465
475
{
466
- var chars = value . ToArray ( ) ;
467
- int bytesCount = Encoding . UTF8 . GetBytes ( chars , 0 , chars . Length , bytes , 0 ) ;
468
- return stream . WriteAsync ( bytes , 0 , bytesCount , token ) ;
476
+ await stream . WriteAsync ( bytes , offset , count , token ) ;
469
477
}
470
478
finally
471
479
{
472
480
BufferPool . ReleaseBufferToPool ( ref bytes ) ;
473
481
}
474
482
}
475
-
483
+
476
484
public override Task WriteAsync ( Stream stream , ReadOnlyMemory < char > value , CancellationToken token = default ) =>
477
485
WriteAsync ( stream , value . Span , token ) ;
478
486
479
- public override Task WriteAsync ( Stream stream , ReadOnlyMemory < byte > value , CancellationToken token = default )
487
+ public override async Task WriteAsync ( Stream stream , ReadOnlyMemory < byte > value , CancellationToken token = default )
480
488
{
481
489
byte [ ] bytes = BufferPool . GetBuffer ( value . Length ) ;
482
490
try
@@ -485,11 +493,10 @@ public override Task WriteAsync(Stream stream, ReadOnlyMemory<byte> value, Cance
485
493
if ( stream is MemoryStream ms )
486
494
{
487
495
ms . Write ( bytes , 0 , value . Length ) ;
488
- return TypeConstants . EmptyTask ;
489
496
}
490
497
else
491
498
{
492
- return stream . WriteAsync ( bytes , 0 , value . Length , token ) ;
499
+ await stream . WriteAsync ( bytes , 0 , value . Length , token ) ;
493
500
}
494
501
}
495
502
finally
0 commit comments