public static void AddUser <T>(UrlSubscription <T> user) { //attempt to get type subscription SubscriptionsByType subscriptionsByUser; SubscriptionsByType.TryGetValue(typeof(T), out subscriptionsByUser); //if unable to get attempt to add if (subscriptionsByUser == null) { subscriptionsByUser = new SubscriptionsByType() { SubscriptionType = typeof(T) }; //add new type subscription var wasAdded = SubscriptionsByType.TryAdd(typeof(T), subscriptionsByUser); //if add failed then likely another thread was adding at the same time, try again if (!wasAdded) { AddUser <T>(user); return; } } //attempt to get user subscription SubscriptionsByUser subscriptionsByUrl; subscriptionsByUser.SubscriptionsByUser.TryGetValue(user.ConnectionId, out subscriptionsByUrl); //if unable to get attempt to add if (subscriptionsByUrl == null) { subscriptionsByUrl = new SubscriptionsByUser() { SubscriptionType = typeof(T) }; //add new type subscription var wasAdded = subscriptionsByUser.SubscriptionsByUser.TryAdd(user.ConnectionId, subscriptionsByUrl); //if add failed then likely another thread was adding at the same time, try again if (!wasAdded) { AddUser <T>(user); return; } } //add or update value with new value subscriptionsByUrl.SubscriptionsByUrl.AddOrUpdate(user.Url, user, (key, oldValue) => oldValue = user); }
public static void AddUser(UserSubscription user) { // 获取某个主题订阅 SubscriptionsByTopic subscriptionsByTopic; SubscriptionsByTopic.TryGetValue(user.Topic, out subscriptionsByTopic); // 如果主题不存在,新添加 if (subscriptionsByTopic == null) { subscriptionsByTopic = new SubscriptionsByTopic() { Topic = user.Topic }; var wasAdded = SubscriptionsByTopic.TryAdd(user.Topic, subscriptionsByTopic); } // 获取某个主题用户的全部订阅 SubscriptionsByUser subscriptionsByUser; subscriptionsByTopic.SubscriptionsByUser.TryGetValue(user.ConnectionId, out subscriptionsByUser); // 主题用户不存在,新添加 if (subscriptionsByUser == null) { subscriptionsByUser = new SubscriptionsByUser() { ConnectionId = user.ConnectionId, }; var wasAdded = subscriptionsByTopic.SubscriptionsByUser.TryAdd(user.ConnectionId, subscriptionsByUser); } // 用户订阅值同步 subscriptionsByUser.SubscriptionsByTopic.AddOrUpdate(user.Topic, user, (key, oldValue) => oldValue = user); }