diff --git a/src/Microsoft.AspNetCore.SignalR.Redis/RedisHubLifetimeManager.cs b/src/Microsoft.AspNetCore.SignalR.Redis/RedisHubLifetimeManager.cs index 0c9aa4a2d9..b1a5761e88 100644 --- a/src/Microsoft.AspNetCore.SignalR.Redis/RedisHubLifetimeManager.cs +++ b/src/Microsoft.AspNetCore.SignalR.Redis/RedisHubLifetimeManager.cs @@ -220,7 +220,7 @@ namespace Microsoft.AspNetCore.SignalR.Redis await previousTask; var tasks = new List(group.Connections.Count); - foreach (var groupConnection in group.Connections.Cast()) + foreach (var groupConnection in group.Connections) { tasks.Add(WriteAsync(groupConnection, data)); } @@ -275,10 +275,18 @@ namespace Microsoft.AspNetCore.SignalR.Redis _redisServerConnection.Dispose(); } - private Task WriteAsync(Connection connection, byte[] data) + private async Task WriteAsync(Connection connection, byte[] data) { var buffer = ReadableBuffer.Create(data).Preserve(); - return connection.Transport.Output.WriteAsync(new Message(buffer, connection.Metadata.Format, endOfMessage: true)); + var message = new Message(buffer, connection.Metadata.Format, endOfMessage: true); + + while (await connection.Transport.Output.WaitToWriteAsync()) + { + if (connection.Transport.Output.TryWrite(message)) + { + break; + } + } } private class LoggerTextWriter : TextWriter diff --git a/src/Microsoft.AspNetCore.SignalR/DefaultHubLifetimeManager.cs b/src/Microsoft.AspNetCore.SignalR/DefaultHubLifetimeManager.cs index bb3e90d9d8..e5574e0708 100644 --- a/src/Microsoft.AspNetCore.SignalR/DefaultHubLifetimeManager.cs +++ b/src/Microsoft.AspNetCore.SignalR/DefaultHubLifetimeManager.cs @@ -124,12 +124,21 @@ namespace Microsoft.AspNetCore.SignalR return TaskCache.CompletedTask; } - private static Task WriteAsync(Connection connection, IInvocationAdapter invocationAdapter, InvocationDescriptor message) + private static async Task WriteAsync(Connection connection, IInvocationAdapter invocationAdapter, InvocationDescriptor invocation) { var stream = new MemoryStream(); - invocationAdapter.WriteMessageAsync(message, stream); + await invocationAdapter.WriteMessageAsync(invocation, stream); + var buffer = ReadableBuffer.Create(stream.ToArray()).Preserve(); - return connection.Transport.Output.WriteAsync(new Message(buffer, connection.Metadata.Format, endOfMessage: true)); + var message = new Message(buffer, connection.Metadata.Format, endOfMessage: true); + + while (await connection.Transport.Output.WaitToWriteAsync()) + { + if (connection.Transport.Output.TryWrite(message)) + { + break; + } + } } } }