SignalR 1.1.3统计在线用户\连接,例外有时不起作用

时间:2016-02-01 16:20:00

标签: c# asp.net-mvc signalr signalr-hub

基本上它可以工作但有时会发生这些异常(总是在 OnReconnected 上):

  
      
  1. System.IndexOutOfRangeException:索引超出了数组的范围。

  2.   
  3. System.InvalidOperationException:修改了集合;枚举操作可能无法执行。

  4.   

我想知道哪个是问题(比如当你尝试将foreach中的项目添加到同一个列表中时),但是我该怎么做才能解决这个问题?

代码:

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));
    }
}

1 个答案:

答案 0 :(得分:0)

解决使用&#34;锁定(用户)&#34;防止不同的线程可以同时修改用户。

示例:

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