ThreadStaticAttribute в ASP.NET - PullRequest
       10

ThreadStaticAttribute в ASP.NET

20 голосов
/ 25 января 2011

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

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

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

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

Ответы [ 2 ]

30 голосов
/ 25 января 2011

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

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

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

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

1 голос
/ 25 января 2011

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

...