Как безопасно считать сеансы: является ли Session_Start / End в Global.Asax безопасным / достаточно безопасным? - PullRequest
2 голосов
/ 20 апреля 2009

Я хочу знать количество одновременных сеансов в данный момент. Но с пауками и балансировщиками нагрузки и, возможно, влияниями, которые не знают о том, насколько безопасно делать это в глобальном asax:

void Session_Start(object sender, EventArgs e)
{
  counter++;
}

void Session_End(object sender, EventArgs e)
{
  counter--;
}

Какие-нибудь советы?

Ответы [ 2 ]

2 голосов
/ 20 апреля 2009

По крайней мере, у этого решения есть проблема с многопоточностью (помимо других проблем, которые могут затронуть вас, как вы упомянули, и я не буду освещать):

Задача увеличения и уменьшения должна выполняться атомарным способом, используя методы Interlocked.Increment и Interlocked.Decrement вместо ++ или --.

1 голос
/ 20 апреля 2009

Если вы храните сеанс на сервере базы данных или сервере состояний, событие Session_End не будет запущено. Иначе я думаю, что не должно быть никаких проблем.

Кроме того, увеличивая / уменьшая счетчик, вы должны получить блокировку для объекта, подобного этому -

lock(<some shared object>)
{
    counter++;
}

Вы также можете попробовать взглянуть на this .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...