基本上它可以工作但有时会发生这些异常(总是在 OnReconnected 上):
System.IndexOutOfRangeException:索引超出了数组的范围。
- 醇>
System.InvalidOperationException:修改了集合;枚举操作可能无法执行。
我想知道哪个是问题(比如当你尝试将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));
}
}
答案 0 :(得分:0)
解决使用&#34;锁定(用户)&#34;防止不同的线程可以同时修改用户。
示例:
private void RemoveUser()
{
string clientId = GetClientId();
lock(users)
{
users.Remove(users.FirstOrDefault(x => x.ClientId == clientId));
}
}