From 9c10b89fa83220194c8814043ef7b662aaee656c Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 4 Nov 2016 01:50:55 -0700 Subject: [PATCH] Small tweaks to sample - Fix redis issues with removing while - Use string interpolation in the Chat hub --- samples/SocketsSample/Hubs/Chat.cs | 12 ++++++------ .../RedisHubLifetimeManager.cs | 19 ++++++++++++++++--- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/samples/SocketsSample/Hubs/Chat.cs b/samples/SocketsSample/Hubs/Chat.cs index 0d05dcde30..8ca2ba3ac3 100644 --- a/samples/SocketsSample/Hubs/Chat.cs +++ b/samples/SocketsSample/Hubs/Chat.cs @@ -8,27 +8,27 @@ namespace SocketsSample.Hubs { public override async Task OnConnectedAsync() { - await Clients.All.InvokeAsync("Send", Context.Connection.ConnectionId + " joined"); + await Clients.All.InvokeAsync("Send", $"{Context.Connection.ConnectionId} joined"); } public override async Task OnDisconnectedAsync() { - await Clients.All.InvokeAsync("Send", Context.Connection.ConnectionId + " left"); + await Clients.All.InvokeAsync("Send", $"{Context.Connection.ConnectionId} left"); } public Task Send(string message) { - return Clients.All.InvokeAsync("Send", Context.ConnectionId + ": " + message); + return Clients.All.InvokeAsync("Send", $"{Context.ConnectionId}: {message}"); } public Task SendToGroup(string groupName, string message) { - return Clients.Group(groupName).InvokeAsync("Send", Context.ConnectionId + ": " + message); + return Clients.Group(groupName).InvokeAsync("Send", $"{Context.ConnectionId}@{groupName}: {message}"); } public async Task JoinGroup(string groupName) { - await Clients.Group(groupName).InvokeAsync("Send", Context.Connection.ConnectionId + " joined " + groupName); + await Clients.Group(groupName).InvokeAsync("Send", $"{Context.Connection.ConnectionId} joined {groupName}"); await Groups.AddAsync(groupName); } @@ -37,7 +37,7 @@ namespace SocketsSample.Hubs { await Groups.RemoveAsync(groupName); - await Clients.Group(groupName).InvokeAsync("Send", Context.Connection.ConnectionId + " left " + groupName); + await Clients.Group(groupName).InvokeAsync("Send", $"{Context.Connection.ConnectionId} left {groupName}"); } } } diff --git a/src/Microsoft.AspNetCore.SignalR.Redis/RedisHubLifetimeManager.cs b/src/Microsoft.AspNetCore.SignalR.Redis/RedisHubLifetimeManager.cs index 07eb67c0fb..8df2468090 100644 --- a/src/Microsoft.AspNetCore.SignalR.Redis/RedisHubLifetimeManager.cs +++ b/src/Microsoft.AspNetCore.SignalR.Redis/RedisHubLifetimeManager.cs @@ -2,6 +2,7 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -170,7 +171,9 @@ namespace Microsoft.AspNetCore.SignalR.Redis if (groupNames != null) { - foreach (var group in groupNames) + // Copy the groups to an array here because they get removed from this collection + // in RemoveGroupAsync + foreach (var group in groupNames.ToArray()) { tasks.Add(RemoveGroupAsync(connection, group)); } @@ -184,7 +187,11 @@ namespace Microsoft.AspNetCore.SignalR.Redis var groupChannel = typeof(THub).FullName + "." + groupName; var groupNames = connection.Metadata.GetOrAdd("group", _ => new HashSet()); - groupNames.Add(groupName); + + lock (groupNames) + { + groupNames.Add(groupName); + } var group = _groups.GetOrAdd(groupChannel, _ => new GroupData()); @@ -234,7 +241,13 @@ namespace Microsoft.AspNetCore.SignalR.Redis } var groupNames = connection.Metadata.Get>("group"); - groupNames?.Remove(groupName); + if (groupNames != null) + { + lock (groupNames) + { + groupNames.Remove(groupName); + } + } await group.Lock.WaitAsync(); try