@@ -35,6 +35,7 @@ class WebSocketTransport(Uri _uri) : ITransport, IDisposable
3535 private readonly ArraySegment < byte > _receiveBuffer = new ( new byte [ 1024 * 8 ] ) ;
3636
3737 private readonly SemaphoreSlim _socketSendSemaphoreSlim = new ( 1 , 1 ) ;
38+ private readonly MemoryStream _sharedMemoryStream = new ( ) ;
3839
3940 public async Task ConnectAsync ( CancellationToken cancellationToken )
4041 {
@@ -43,21 +44,19 @@ public async Task ConnectAsync(CancellationToken cancellationToken)
4344
4445 public async Task < byte [ ] > ReceiveAsync ( CancellationToken cancellationToken )
4546 {
46- using var ms = new MemoryStream ( ) ;
47+ _sharedMemoryStream . SetLength ( 0 ) ;
4748
4849 WebSocketReceiveResult result ;
4950
5051 do
5152 {
5253 result = await _webSocket . ReceiveAsync ( _receiveBuffer , cancellationToken ) . ConfigureAwait ( false ) ;
5354
54- await ms . WriteAsync ( _receiveBuffer . Array ! , _receiveBuffer . Offset , result . Count , cancellationToken ) . ConfigureAwait ( false ) ;
55+ await _sharedMemoryStream . WriteAsync ( _receiveBuffer . Array ! , _receiveBuffer . Offset , result . Count , cancellationToken ) . ConfigureAwait ( false ) ;
5556 }
5657 while ( ! result . EndOfMessage ) ;
5758
58- ms . Seek ( 0 , SeekOrigin . Begin ) ;
59-
60- byte [ ] data = ms . ToArray ( ) ;
59+ byte [ ] data = _sharedMemoryStream . ToArray ( ) ;
6160
6261 if ( _logger . IsEnabled ( LogEventLevel . Trace ) )
6362 {
@@ -69,10 +68,12 @@ public async Task<byte[]> ReceiveAsync(CancellationToken cancellationToken)
6968
7069 public async Task SendAsync ( byte [ ] data , CancellationToken cancellationToken )
7170 {
72- await _socketSendSemaphoreSlim . WaitAsync ( cancellationToken ) ;
71+ var semaphoreTask = _socketSendSemaphoreSlim . WaitAsync ( cancellationToken ) ;
7372
7473 try
7574 {
75+ await semaphoreTask . ConfigureAwait ( false ) ;
76+
7677 if ( _logger . IsEnabled ( LogEventLevel . Trace ) )
7778 {
7879 _logger . Trace ( $ "BiDi SND --> { Encoding . UTF8 . GetString ( data ) } ") ;
@@ -89,5 +90,7 @@ public async Task SendAsync(byte[] data, CancellationToken cancellationToken)
8990 public void Dispose ( )
9091 {
9192 _webSocket . Dispose ( ) ;
93+ _sharedMemoryStream . Dispose ( ) ;
94+ _socketSendSemaphoreSlim . Dispose ( ) ;
9295 }
9396}
0 commit comments