如何通过其方法同步对类的私有静态字段的访问?

时间:2011-03-26 12:54:46

标签: asp.net-mvc multithreading iis comet parallel-processing

我在我的MVC Web应用程序中使用PokiIn库向客户端推送通知来实现COMET。

每当客户端连接时,ClientId都可以在CometWorker类的OnClientConnected事件中使用:

public static Dictionary<int, string> clientsList 
                            = new Dictionary<int, string>();
public static string clientId = "";
static void OnClientConnected(string clientId, 
                                        ref Dictionary<string, object> list)
{
        BaseController.clientId = clientId;
}

我将处理程序中收到的clientId分配给控制器的静态ClientId。然后,当调用Handler操作时,我将此ClientId映射到登录用户的标识: -

public ActionResult Handler()
        {
            if (User.Identity.IsAuthenticated)
            {
                if (clientsList.Keys.Contains(currentUser.UserId))
                    clientsList[currentUser.UserId] = clientId;
                else
                    clientsList.Add(currentUser.UserId, clientId);
            }
            return View();
        }

由于服务器上的不同线程将提供多个请求,因此每个请求都将访问这两种方法中的静态ClientId。

如何同步其访问权限,以便在两个方法(OnClientConnected和Handler)中直到一个请求完成,另一个请求等待它?

如果我的问题不明确,请告诉我。我会尝试进一步改进它。

2 个答案:

答案 0 :(得分:2)

将clientid存储在用户的会话中,而不是存储在控制器上的静态变量中。它需要与用户相关的数据而不是整个应用程序。或者更好的是,在客户端连接时解析名称/ id查找。

答案 1 :(得分:0)

我想您应该在需要更新词典时使用lock(clientsList){}