Каковы лучшие практики для использования локального хранилища потоков в .NET? - PullRequest
7 голосов
/ 06 октября 2008

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

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

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

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

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

Любой совет, есть что знать?

[Изменить]

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

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

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

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

Ответы [ 3 ]

7 голосов
/ 06 октября 2008

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

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

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

6 голосов
/ 06 октября 2008

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

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

0 голосов
/ 29 февраля 2012

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

...