ThreadStaticAttribute в ASP.NET

У меня есть компонент, которому необходимо хранить значения static для каждого потока. Это общий компонент, который может использоваться во многих сценариях, а не только в ASP.NET.

Я думал использовать атрибут [ThreadStatic] для достижения своей цели. Предположим, что он также отлично работает в сценариях ASP.NET, потому что я предполагал, что каждый запрос вызывается в собственном потоке.

После некоторого исследования я нашел этот пост в блоге от Scott Hanselman, говорящего, чтобы быть осторожным при использовании [ThreadStatic] в ASP.NET.

Однако большинство комментариев (ниже сообщения) не согласны с тем, что написал Скотт, заявив, что запрос всегда выполняется в одном потоке и что поток не используется другим запросом одновременно. Это также то, что я считаю, но хотел бы иметь некоторое мнение о вас, экспертов здесь.

Ответ 1

Нет, Скотт прав: запрос определенно не должен работать в одном потоке в течение всего его времени. В этом отношении ASP.NET является проворной. Есть только несколько моментов, когда коммутатор может произойти, но это определенно может случиться. (Я проверял это для себя.)

Вы можете прочитать этот пост в блоге и этот Spring темы форума для более подробной информации.

В принципе, вы должны найти другой способ захвата контекста. Соответствующий бит с вашей точки зрения, вероятно, находится в конце сообщения в блоге:

Это основная PITA, потому что, насколько я вижу, это означает, что единственным вариантом сохранения для ThreadStatic'esque поведения в ASP.Net является использование HttpContext. Таким образом, для ваших бизнес-объектов вы либо застреваете с if (HttpContext.Current!= Null), либо с помощью ссылки System.Web(yuck), или вам нужно придумать какую-то модель поставщика для вашей статической настойчивости, которые будут нуждаться в настройке до того момента, когда любой из этих синглетонов будет доступен. Двойная юка.

Ответ 2

Я не уверен в использовании локальных данных потока в среде ASP.NET, но .NET 4.0 поставляется с классом ThreadLocal.