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);
        }
Beispiel #2
0
        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);
        }