[ThreadStatic]
é definido usando atributo enquanto ThreadLocal<T>
usa genérico. Por que diferentes soluções de design foram escolhidas? Quais são as vantagens e desvantagens de usar atributos genéricos em vez de atributos neste caso?
c#
generics
attributes
thread-local
threadstatic
user2341923
fonte
fonte
Respostas:
Algo que o post do blog anotado nos comentários não deixa explícito, mas acho muito importante, é que
[ThreadStatic]
não inicializa as coisas automaticamente para cada tópico. Por exemplo, digamos que você tenha este:O primeiro thread que usar isso será
Foo
inicializado como42
. Mas os tópicos subsequentes não. O inicializador funciona apenas para o primeiro thread. Então você acaba tendo que escrever código para verificar se ele foi inicializado.ThreadLocal<T>
resolve esse problema permitindo que você forneça uma função de inicialização (como mostra o blog de Reed) que é executada antes da primeira vez que o item é acessado.Em minha opinião, não há vantagem em usar em
[ThreadStatic]
vez deThreadLocal<T>
.fonte
ThreadLocal<T>
esteja disponível no .NET 4 e superior, e oThreadStatic
atributo também está disponível no 3.5 e abaixo.ThreadLocal<T>
implementaIDisposable
e geralmente força você a implementarIDisposable
também, o que força seus chamadores a descartá-lo e, portanto, implementarIDisposable
também ...ThreadLocal
ouThreadStatic
com threads de pool. Esses valores permanecerão por toda a vida útil do thread do pool, não apenas para a tarefa que você atribui. Isso pode causar problemas de maneiras nada óbvias. Consulte stackoverflow.com/questions/561518/… e perguntas semelhantes para obter mais informações.static
? Consulte msdn.microsoft.com/en-us/library/…ThreadStatic Initialize apenas no primeiro thread, ThreadLocal Initialize para cada thread. Abaixo está a demonstração simples:
fonte
A ideia principal por trás do ThreadStatic é manter uma cópia separada da variável para cada thread .
No snippet acima, temos uma cópia separada de
value
para cada tópico, incluindo o tópico principal.Portanto, uma variável ThreadStatic será inicializada com seu valor padrão em outras threads, exceto na thread em que foi criada.
Se quisermos inicializar a variável em cada thread à nossa maneira, use ThreadLocal.
fonte