Класс HttpContext и его безопасность потоков - PullRequest
2 голосов
/ 27 сентября 2011

У меня есть Singleton объект в приложении, который имеет следующее свойство:

private AllocationActionsCollection AllocationActions
{
    get
    {
        return HttpContext.Current.Session["AllocationOptions.AllocationActions"] as AllocationActionsCollection;
    }
    set
    {
        HttpContext.Current.Session["AllocationOptions.AllocationActions"] = value;
    }
}

Я имею дело с одной ошибкой ( HttpContext.Current.Session ["AllocationOptions.AllocationActions"] равен нулю , даже если предполагается, что он всегда установлен в допустимый экземпляр ...). Я только что прочитал в MSDN, что HttpContext член экземпляра не гарантированно безопасен для потоков! Интересно, может ли это быть проблемой? Где-то в приложении может происходить скачок ресурсов, и момент, когда HttpContext.Current.Session ["AllocationOptions.AllocationActions"] равен нулю - это момент, когда метод задания AllocationActions используется с использованием этого оператора:

AllocationActions = new AllocationActionsCollection(Instance.CacheId);

Мои вопросы:

а) Я в шоке, что HttpContext.Current.Session не является поточно-ориентированным. Как безопасно использовать это свойство тогда? б) есть ли у вас идеи, почему эта переменная Session может быть нулевой (хотя я почти уверен, что устанавливаю ее до того, как она будет использована в первый раз)?

Спасибо, Pawel

РЕДАКТИРОВАТЬ 1:

a) строка, которая инициализирует переменную сеанса, устанавливается каждые 2 минуты с помощью следующего оператора (выполняется в Page_Load)

AllocationActions = new AllocationActionsCollection(Instance.CacheId);

б) код, вызывающий метод get, вызывается в обработчиках событий (например, Button_Click)

в) в приложении нет пользовательских потоков. только общий обработчик HTTP

Ответы [ 4 ]

1 голос
/ 27 сентября 2011

HttpContext.Current не является элементом экземпляра, это статический член. Так что это потокобезопасно. И он возвращает экземпляр HttpContext, но он возвращает отдельный экземпляр для каждого запроса - может быть несколько потоков, обрабатывающих запросы, но каждый запрос получит отдельный экземпляр HttpContext. Таким образом, любой данный экземпляр не используется несколькими потоками, и безопасность потоков не является проблемой.

Таким образом, если вы вручную не раскручиваете несколько собственных потоков для одного запроса, вы потоко-безопасны.

1 голос
/ 27 сентября 2011
Объект

A singleton реализуется путем ограничения создания экземпляра класса одним объектом.

HttpContext.Current.Session - область, выделенная для одного пользователя; любой объект, сохраненный в сеансе, будет доступен только для пользователя / сеанса, который его создал.

Любой объект, сохраненный в Application, будет доступен только для каждого пользователя / сеанса.

Любой статический объект также будет доступен только для каждого пользователя / сеанса. Предлагаемые реализации всегда используют статические объекты .. почему не так?

0 голосов
/ 27 сентября 2011

Для безопасного доступа к свойству сеанса вы просто заключили бы доступ в оператор блокировки и использовали объект SyncRoot класса сеанса.

0 голосов
/ 27 сентября 2011

Потоковая безопасность класса HttpContext довольно стандартна для .NET.Основное правило большого пальца (если явно не указано) состоит в том, что статические члены являются потокобезопасными, а члены экземпляра - нет.

В любом случае трудно сказать, почему ваша переменная сеанса равна нулю, не заглядывая вкод, который устанавливает / сбрасывает его.Или, возможно, вы вызываете ваш get_AllocationActions метод из другого сеанса, чем тот, в котором вы его установили. Опять же, поможет больше кода.

...