Use WaitToWriteAsync(), TryWrite() in HubLifetimeManager(s) (#122)

This commit is contained in:
David Fowler 2017-01-11 22:13:12 -08:00 committed by GitHub
parent 20d8f1fca2
commit 172a20c4ec
2 changed files with 23 additions and 6 deletions

View File

@ -220,7 +220,7 @@ namespace Microsoft.AspNetCore.SignalR.Redis
await previousTask; await previousTask;
var tasks = new List<Task>(group.Connections.Count); var tasks = new List<Task>(group.Connections.Count);
foreach (var groupConnection in group.Connections.Cast<Connection>()) foreach (var groupConnection in group.Connections)
{ {
tasks.Add(WriteAsync(groupConnection, data)); tasks.Add(WriteAsync(groupConnection, data));
} }
@ -275,10 +275,18 @@ namespace Microsoft.AspNetCore.SignalR.Redis
_redisServerConnection.Dispose(); _redisServerConnection.Dispose();
} }
private Task WriteAsync(Connection connection, byte[] data) private async Task WriteAsync(Connection connection, byte[] data)
{ {
var buffer = ReadableBuffer.Create(data).Preserve(); 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 private class LoggerTextWriter : TextWriter

View File

@ -124,12 +124,21 @@ namespace Microsoft.AspNetCore.SignalR
return TaskCache.CompletedTask; 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(); var stream = new MemoryStream();
invocationAdapter.WriteMessageAsync(message, stream); await invocationAdapter.WriteMessageAsync(invocation, stream);
var buffer = ReadableBuffer.Create(stream.ToArray()).Preserve(); 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;
}
}
} }
} }
} }