在signalR的hub类中维护对象的实例

时间:2012-07-23 02:30:53

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

我目前在我的集线器类中有以下代码:

public class MatchMaker : Hub
    {    


    private List<SoloUser> soloUsers = new List<SoloUser>();

    //Client Requests
    public void findNewPartner(string Country, string State)
    {
        SoloUser soloUser = soloUsers.FirstOrDefault(s => (s.Country== Country) && (s.State == State));
        if (soloUsers.Count > 0)
            Clients.partnerRequestResult(soloUsers.FirstOrDefault());
        else
        {
            soloUser = new SoloUser { 
                Major = Major,
                School = School,
                SessionId = SessionId,
                Token = token
            };
            soloUsers.Add(soloUser);
        }



    }
}

问题是每当我在客户端调用此方法时,向我的soloUsers集合添加SoloUser对象不会保存,因此当另一个用户再次调用此函数时,linq语句(soloUsers.FirstOrDefault(s => (s.School == School) && (s.Major == Major)) )永远不会找到SoloUser。我怎样才能使我的soloUsers集合保存实例和添加到它的对象?

1 个答案:

答案 0 :(得分:6)

SignalR为您进行的每次通话创建一个新的集线器实例(这是非常轻量级的,不用担心),因此您的soloUsers列表不会在调用之间保持不变。

使列表静态以解决此问题。请注意,在访问列表时需要某种锁定,或者使用concurrent collections之一来使其保证线程安全。