Я внедряю COMET в своем веб-приложении MVC, используя библиотеку PokiIn для отправки уведомлений клиентам.
Когда клиент подключается, ClientId доступен в событии OnClientConnected класса CometWorker:
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();
}
Поскольку несколько запросов будут обслуживаться разными потоками на сервере, каждый из них будет обращаться к статическому идентификатору клиента в обоих методах.
Как я могу синхронизировать его доступ, чтобы с ним выполнялся один запрос в обоих методах (OnClientConnected и Handler), а другой запрос его ожидает?
Пожалуйста, скажите мне, если мой вопрос не ясен. Я постараюсь улучшить его дальше.