private async Task RunConcurrentStreams(bool writeResponseHeaders) { var streamCount = 201; var count = 0; var tcs = new TaskCompletionSource <object?>(TaskCreationOptions.RunContinuationsAsynchronously); async Task WaitForAllStreams(IAsyncStreamReader <DataMessage> requestStream, IServerStreamWriter <DataMessage> responseStream, ServerCallContext context) { Interlocked.Increment(ref count); if (writeResponseHeaders) { await context.WriteResponseHeadersAsync(new Metadata()); } if (count == streamCount) { tcs.SetResult(null); } await tcs.Task; } // Arrange var method = Fixture.DynamicGrpc.AddDuplexStreamingMethod <DataMessage, DataMessage>(WaitForAllStreams); var channel = GrpcChannel.ForAddress(Fixture.GetUrl(TestServerEndpointName.Http2)); var client = TestClientFactory.Create(channel, method); var calls = new AsyncDuplexStreamingCall <DataMessage, DataMessage> [streamCount]; try { // Act for (var i = 0; i < calls.Length; i++) { var call = client.DuplexStreamingCall(); calls[i] = call; if (writeResponseHeaders) { await call.ResponseHeadersAsync.DefaultTimeout(); } } // Assert await Task.WhenAll(calls.Select(c => c.ResponseHeadersAsync)).DefaultTimeout(); } catch (Exception ex) { throw new Exception($"Received {count} of {streamCount} on the server.", ex); } finally { for (var i = 0; i < calls.Length; i++) { calls[i].Dispose(); } } }