2016-02-01 1 views
0

В основном это работает, но иногда эти исключения встречаются (всегда на OnReconnected):SignalR 1.1.3 подсчета пользователей онлайн соединений, исключения и иногда не работает

  1. System.IndexOutOfRangeException: Индекс был вне границ массива.

  2. System.InvalidOperationException: коллекция была изменена; операция перечисления может не выполняться.

я думаю, чтобы узнать, что проблема (например, при попытке добавить элемент в Еогеасп в том же списке), но что я могу сделать, чтобы решить эту проблему?

Код:

public class UsersHub : Hub 
{ 
    private struct SignalRUser 
    { 
     public string ClientId { get; set; } 

     public string Username { get; set; } 
    } 

    static IList<SignalRUser> users = new List<SignalRUser>(); 

    public override Task OnConnected() 
    { 
     this.AddUser(); 

     return base.OnConnected(); 
    } 

    public override Task OnDisconnected() 
    { 
     this.RemoveUser(); 

     return base.OnDisconnected(); 
    } 

    public override Task OnReconnected() 
    { 
     this.AddUser(); 

     return base.OnReconnected(); 
    } 

    private string GetClientId() 
    { 
     string clientId = ""; 
     if (!(Context.QueryString["clientId"] == null)) 
     { 
      clientId = Context.QueryString["clientId"].ToString(); 
     } 

     if (clientId.Trim() == "") 
     { 
      clientId = Context.ConnectionId; 
     } 

     return clientId; 
    } 

    private void AddUser() 
    { 
     var user = Membership.GetUser(); 
     string clientId = GetClientId(); 

     if (!users.Any(x => x.ClientId == clientId)) 
     { 
      users.Add(new SignalRUser 
      { 
       ClientId = clientId, 
       Username = user.UserName     
      }); 
     } 
    } 

    private void RemoveUser() 
    { 
     string clientId = GetClientId(); 
     users.Remove(users.FirstOrDefault(x => x.ClientId == clientId)); 
    } 
} 

ответ

0

решается с помощью «блокировки (пользователей)», чтобы предотвратить, что различные потоки могут изменять пользователей одновременно.

пример:

private void RemoveUser() 
{ 
    string clientId = GetClientId(); 
    lock(users) 
    { 
     users.Remove(users.FirstOrDefault(x => x.ClientId == clientId)); 
    } 
}