[ThreadStatic]
определяется с помощью атрибута, а ThreadLocal<T>
использует общий. Почему были выбраны разные дизайнерские решения? Каковы преимущества и недостатки использования универсальных атрибутов в этом случае?
c#
generics
attributes
thread-local
threadstatic
user2341923
источник
источник
Ответы:
Что-то в сообщении блога, отмеченном в комментариях, не говорится явным образом, но я считаю очень важным, это то,
[ThreadStatic]
что не инициализируется автоматически для каждого потока. Например, скажем, у вас есть это:Первый поток, который его использует, будет
Foo
инициализирован как42
. Но последующих потоков не будет. Инициализатор работает только для первого потока. В итоге вам придется писать код, чтобы проверить, инициализирован ли он.ThreadLocal<T>
решает эту проблему, позволяя вам предоставить функцию инициализации (как показывает блог Рида), которая запускается до первого доступа к элементу.На мой взгляд, в использовании
[ThreadStatic]
вместоThreadLocal<T>
.источник
ThreadLocal<T>
доступно в .NET 4 и выше, а атрибут также доступен в версииThreadStatic
3.5 и ниже.ThreadLocal<T>
реализуетIDisposable
и обычно вынуждает вас реализовыватьIDisposable
, что заставляет ваших вызывающих избавляться от вас и, следовательно, также реализовыватьIDisposable
...ThreadLocal
илиThreadStatic
с пула потоков. Эти значения будут оставаться в течение всего срока службы потока пула, а не только для задачи, которую вы ему назначаете. Это может доставить вам неприятности довольно неочевидными способами. См. Stackoverflow.com/questions/561518/… и аналогичные вопросы для получения дополнительной информации.static
? См. Msdn.microsoft.com/en-us/library/…ThreadStatic Initialize только в первом потоке, ThreadLocal Initialize для каждого потока. Ниже простая демонстрация:
источник
Основная идея ThreadStatic состоит в том, чтобы поддерживать отдельную копию переменной для каждого потока .
В приведенном выше фрагменте у нас есть отдельная копия
value
для каждого потока, включая основной поток.Таким образом, переменная ThreadStatic будет инициализирована значением по умолчанию в других потоках, кроме потока, в котором она создана.
Если мы хотим инициализировать переменную в каждом потоке по-своему, используйте ThreadLocal.
источник