@@ -16,9 +16,10 @@ public class WebSocketTransport(Uri _uri) : ITransport, IDisposable
16
16
private readonly ClientWebSocket _webSocket = new ( ) ;
17
17
private readonly ArraySegment < byte > _receiveBuffer = new ( new byte [ 1024 * 8 ] ) ;
18
18
19
+ private readonly SemaphoreSlim _socketSendSemaphoreSlim = new ( 1 , 1 ) ;
20
+
19
21
public async Task ConnectAsync ( CancellationToken cancellationToken )
20
22
{
21
- _webSocket . Options . SetBuffer ( _receiveBuffer . Count , _receiveBuffer . Count , _receiveBuffer ) ;
22
23
await _webSocket . ConnectAsync ( _uri , cancellationToken ) . ConfigureAwait ( false ) ;
23
24
}
24
25
@@ -32,8 +33,9 @@ public async Task<T> ReceiveAsJsonAsync<T>(JsonSerializerOptions jsonSerializerO
32
33
{
33
34
result = await _webSocket . ReceiveAsync ( _receiveBuffer , cancellationToken ) . ConfigureAwait ( false ) ;
34
35
35
- await ms . WriteAsync ( _receiveBuffer . Array ! , _receiveBuffer . Offset , result . Count ) . ConfigureAwait ( false ) ;
36
- } while ( ! result . EndOfMessage ) ;
36
+ await ms . WriteAsync ( _receiveBuffer . Array ! , _receiveBuffer . Offset , result . Count , cancellationToken ) . ConfigureAwait ( false ) ;
37
+ }
38
+ while ( ! result . EndOfMessage ) ;
37
39
38
40
ms . Seek ( 0 , SeekOrigin . Begin ) ;
39
41
@@ -51,12 +53,21 @@ public async Task SendAsJsonAsync(Command command, JsonSerializerOptions jsonSer
51
53
{
52
54
var buffer = JsonSerializer . SerializeToUtf8Bytes ( command , typeof ( Command ) , jsonSerializerOptions ) ;
53
55
54
- if ( _logger . IsEnabled ( LogEventLevel . Trace ) )
56
+ await _socketSendSemaphoreSlim . WaitAsync ( cancellationToken ) ;
57
+
58
+ try
55
59
{
56
- _logger . Trace ( $ "BiDi SND >> { buffer . Length } > { Encoding . UTF8 . GetString ( buffer ) } ") ;
57
- }
60
+ if ( _logger . IsEnabled ( LogEventLevel . Trace ) )
61
+ {
62
+ _logger . Trace ( $ "BiDi SND >> { buffer . Length } > { Encoding . UTF8 . GetString ( buffer ) } ") ;
63
+ }
58
64
59
- await _webSocket . SendAsync ( new ArraySegment < byte > ( buffer ) , WebSocketMessageType . Text , true , cancellationToken ) . ConfigureAwait ( false ) ;
65
+ await _webSocket . SendAsync ( new ArraySegment < byte > ( buffer ) , WebSocketMessageType . Text , true , cancellationToken ) . ConfigureAwait ( false ) ;
66
+ }
67
+ finally
68
+ {
69
+ _socketSendSemaphoreSlim . Release ( ) ;
70
+ }
60
71
}
61
72
62
73
public void Dispose ( )
0 commit comments