Как я могу синхронизировать доступ к закрытому статическому полю класса его методами? - PullRequest
0 голосов
/ 26 марта 2011

Я внедряю 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), а другой запрос его ожидает?

Пожалуйста, скажите мне, если мой вопрос не ясен. Я постараюсь улучшить его дальше.

Ответы [ 2 ]

2 голосов
/ 26 марта 2011

Храните клиентские данные в сеансе пользователя, а не в статической переменной на контроллере.Это должно быть в данных, связанных с пользователем, а не всего приложения.Или еще лучше: разрешите поиск имени / идентификатора при подключении клиента.

0 голосов
/ 26 марта 2011

Я думаю, вы должны использовать lock(clientsList){} всякий раз, когда вы хотите обновить свой словарь

...