Работает ли сеанс потокобезопасным?

Предположим, пользователь делает несколько запросов одновременно, нужно ли мне блокировать весь код, который работает с сеансом?

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

Запрос 1:

if(Session["user"] != null)
    lblName.Text = Session["user"].Name;

Запрос 2:

if(logout)
   Session["user"] = null;

Возможно ли, что Запрос 1 выдает исключение NullPointerException при доступе к свойству Name? Нужно ли мне заблокировать код в запросе 1, чтобы убедиться, что пользователь все еще существует после проверки на null? Или ASP.NET как-то справляется с этим автоматически?

22
задан magnattic 10 August 2011 в 15:15
поделиться

2 ответа

Как всегда, ответ зависит от того, что вы подразумеваете под «безопасностью». В ASP .NET каждый запрос получает эксклюзивный доступ к своему состоянию сеанса. Это означает, что вам не нужно беспокоиться о синхронизации доступа в рамках одного запроса. Если Session ["user"] не равен NULL, то он будет иметь значение NULL для всей продолжительности текущего запроса. В вашем примере запрос 1 никогда не сгенерирует исключение нулевой ссылки.

10
ответ дан 29 November 2019 в 05:15
поделиться

В ASP.NET модуль сеанса использует пару блокировок чтения / записи на сеанс , поэтому запрос 1 будет иметь согласованные чтения, а запрос 2 будет блокироваться до завершения запроса 1.

5
ответ дан 29 November 2019 в 05:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: