Каковы рекомендации по использованию локального хранилища потоков в .NET?

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

Прочитал несколько статей на эту тему:

http://www.dotnetcoders.com/web/Articles/ShowArticle.aspx?article=58

http://msdn.microsoft.com/en-us/library/system.threadstaticattribute(vs.80).aspx

Я знаю, как им пользоваться, мне просто интересно, следует ли его использовать.

Любые советы, Gotchas, чтобы быть в курсе?

[Изменить]

Вот вариант использования:

Я направляю весь доступ к данным через несколько методов, которые ведут много журналов по каждому запросу. Одна вещь, которую я регистрирую, — это полный дамп текста команды с заполненными командами, чтобы я мог просто копировать и вставлять из своих журналов трассировки непосредственно в Sql Management Studio.

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

Я не хочу менять сигнатуры методов моих классов доступа к данным только для того, чтобы я мог передать некоторую ссылку по всему стеку, просто чтобы получить ее, когда я получаю исключение. Я подумал, может быть, TLS будет хорошим местом для размещения чего-то вроде «lastsqlcommand», но это не похоже на жизнеспособное решение.


person Eric Z Beard    schedule 06.10.2008    source источник
comment
Я всегда избегал локального хранилища потока и нашел другой способ сделать то же самое. Я всегда думал, что локальное хранилище потока, вероятно, медленнее, чем прямой доступ (не уверен, правильно это или нет). Мне было бы любопытно, что думают и другие.   -  person dongola7    schedule 06.10.2008


Ответы (3)


Подсказка для приложений asp.net: обработка одного запроса может переключать потоки, а именно, если в одном сеансе есть параллельные запросы. Из-за этого все, что вы помещаете в TLS до события HttpApplication.PostRequireRequestState, может отсутствовать позже, потому что вы находитесь в другом потоке.

[Редактировать автором вопроса]

В моем конкретном случае я закончил тем, что добавил пару ключ-значение в словарь SqlException.Data, который затем извлекаю, когда регистрирую сведения об исключении. Это дает мне функциональность, для которой я надеялся использовать локальное хранилище потока.

person csgero    schedule 06.10.2008
comment
Это именно то, что я искал. Я подозревал, что это может быть ненадежным в этом сценарии. Спасибо. - person Eric Z Beard; 06.10.2008
comment
Это старый ответ, но немного поясню: ASP.NET переключает потоки только в очень специфических сценариях. Самым большим является использование асинхронных методов ввода-вывода - см., например. Лхотка и Гатри обсуждают: lhotka.net/WeBlog / - person EBarr; 18.03.2012

Локальное хранилище потоков — это быстрый способ исправить библиотеку, которая была разработана до потоков и использует множество глобальных переменных и статических данных. Именно так стандартная библиотека C была сделана потокобезопасной, не меняя при этом ее интерфейс (внутри многие функции используют статические буферы).

В общем, для этих целей годится. Если вам нужно иметь глобальные данные в многопоточной среде, то локальная память потока — хороший способ. Распространенной причиной является то, что вы вызываете стороннюю функцию, которая вызывает вас обратно в том же фрейме стека, но не дает вам ловушку для передачи дополнительной информации - это часто происходит, когда вы пытаетесь обернуть старые библиотеки C в .СЕТЬ.

person Lou Franco    schedule 06.10.2008

Взгляните на новый класс .net 4 ThreadLocal‹T› с например, дополнительная информация здесь.

person xhafan    schedule 29.02.2012