2015-01-17 2 views
0

У меня есть параллельный словарь Список на моем контроллере, в котором хранится список пользователей онлайн. Например, когда клиент A и клиент B подключаются, в списке присутствуют 2 онлайн-клиента, но когда я отключу B и повторно подключаюсь снова, он должен все еще показывать 2 онлайн-клиента, но в моем случае только клиент B обнаруживается как пользователь онлайн (отключен, затем снова подключен). Я использую сервер IIS 7.5. Пожалуйста, помогите мне в этом, нужно ли мне использовать базу данных, а не словарь? Я думаю, что он сбрасывает словарь к нулю, если один пользователь отсоединяется и воссоединяется снова .... :(Вот мой хаб код классаделает onDisconnect событие на SignalR2 освобождает все свои ресурсы после отключения?

public class Chat : Hub 
{ 
    //add online client 
    private static ConcurrentDictionary<string, string> personLists 
    = new ConcurrentDictionary<string, string>(); 

    public void Connect(string Username, int ID) 
    { 
     string id = Context.ConnectionId; 
     if (!personLists.ContainsKey(Username)) 
     { 
      personLists.TryAdd(Username, id); 
      Clients.Caller.viewOnlinePersons(personLists.Where(p => p.Key != Username)); 
      Clients.Others.enters(Username); 
     } 
     else 
     { 

      string notif = "user: "+Username+" is already used"; 
      Clients.Caller.onUse(notif); 
     } 

ответ

0

Параллельное словарь должен работать нормально. Было бы хорошо, если бы вы могли отправьте некоторый код, но если вы пройдете этот маршрут с помощью параллельного словаря, убедитесь, что он static (классы Hub создаются и уничтожаются на каждый сигнал), и я думаю, что это было бы лучше подходит для самого концентратора и частного (и, конечно, static , снова). Вы также можете использовать Injection Dependency с SignalR, который будет намного чище.

Вам понадобится только база данных в качестве объединительной платы, если вы планируете запустить приложение на нескольких серверах, где, конечно, память одного сервера недоступна для других серверов, и для каждого сервера будет создан дублированный словарь, поэтому в этом случае вам нужно взять хранилище и немного переместить его в архитектуре, чтобы быть доступным для всех серверов.

+0

Спасибо за ответ! Да, мой словарь статичен ... но что вы имеете в виду (классы хабов создаются и уничтожаются за один сигнал)? например, если клиент A и клиент B находятся в режиме онлайн, поэтому параллельный словарь содержит 2 записи, но если один клиент отключается и снова подключается, только этот клиент хранится в статическом словаре, несмотря на то, что другой клиент все еще подключен. словарь содержит 1 запись вместо 2 .. i отлаживает ее, используя окно предупреждения на javascript, чтобы показать количество статического словаря, которое я использовал. –

+0

, поэтому мой вывод заключается в том, что каждый раз, когда пользователь отключается, он сбрасывает словарь до нуля, как насчет когда есть 3 пользователя в сети, и один из них отключается, а затем повторно подключается, словарь сбрасывается до нуля. –

+0

Классы 'Hub' сами существуют только в то время, когда обрабатывается метод хаба и впоследствии уничтожаются. Вот почему я ожидал, что вы используете нестатический 'ConcurrentDictionary', так как это будет создаваться каждый раз, когда кто-то подключается/отключается/вызывается действие хаба. Можете ли вы загрузить все решение где-нибудь для меня, чтобы посмотреть? –

 Смежные вопросы

  • Нет связанных вопросов^_^