diff --git a/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/MsQuic/MsQuicConnection.cs b/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/MsQuic/MsQuicConnection.cs index 82638fc605f6bc..b3cbb93ceda580 100644 --- a/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/MsQuic/MsQuicConnection.cs +++ b/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/MsQuic/MsQuicConnection.cs @@ -74,7 +74,6 @@ internal sealed class State // Backlog limit is managed by MsQuic so it can be unbounded here. public readonly Channel AcceptQueue = Channel.CreateUnbounded(new UnboundedChannelOptions() { - SingleReader = true, SingleWriter = true, }); diff --git a/src/libraries/System.Net.Quic/tests/FunctionalTests/QuicStreamTests.cs b/src/libraries/System.Net.Quic/tests/FunctionalTests/QuicStreamTests.cs index d350c86c4bc14e..438f836b814015 100644 --- a/src/libraries/System.Net.Quic/tests/FunctionalTests/QuicStreamTests.cs +++ b/src/libraries/System.Net.Quic/tests/FunctionalTests/QuicStreamTests.cs @@ -159,6 +159,35 @@ await RunClientServer( ); } + [Fact] + public async Task MultipleConcurrentStreamsOnSingleConnection() + { + const int count = 100; + Task[] tasks = new Task[count]; + + (QuicConnection clientConnection, QuicConnection serverConnection) = await CreateConnectedQuicConnection(); + using (clientConnection) + using (serverConnection) + { + for (int i = 0; i < count; i++) + { + tasks[i] = MakeStreams(clientConnection, serverConnection); + } + await tasks.WhenAllOrAnyFailed(PassingTestTimeoutMilliseconds); + } + + static async Task MakeStreams(QuicConnection clientConnection, QuicConnection serverConnection) + { + byte[] buffer = new byte[64]; + QuicStream clientStream = clientConnection.OpenBidirectionalStream(); + ValueTask writeTask = clientStream.WriteAsync(Encoding.UTF8.GetBytes("PING"), endStream: true); + ValueTask acceptTask = serverConnection.AcceptStreamAsync(); + await new Task[] { writeTask.AsTask(), acceptTask.AsTask()}.WhenAllOrAnyFailed(PassingTestTimeoutMilliseconds); + QuicStream serverStream = acceptTask.Result; + await serverStream.ReadAsync(buffer); + } + } + [Fact] public async Task GetStreamIdWithoutStartWorks() {