[ThreadStatic]
se define usando atributo mientras que ThreadLocal<T>
usa genérico. ¿Por qué se eligieron diferentes soluciones de diseño? ¿Cuáles son las ventajas y desventajas de utilizar atributos genéricos en lugar de en este caso?
c#
generics
attributes
thread-local
threadstatic
usuario2341923
fuente
fuente
Respuestas:
Algo que la publicación del blog anotó en los comentarios no hace explícito, pero me parece muy importante, es que
[ThreadStatic]
no inicializa automáticamente las cosas para cada hilo. Por ejemplo, digamos que tiene esto:El primer hilo que usa esto se verá
Foo
inicializado en42
. Pero los hilos posteriores no lo harán. El inicializador funciona solo para el primer hilo. Entonces terminas teniendo que escribir código para verificar si está inicializado.ThreadLocal<T>
resuelve ese problema permitiéndole proporcionar una función de inicialización (como muestra el blog de Reed) que se ejecuta antes de la primera vez que se accede al elemento.En mi opinión, no hay ninguna ventaja en usar en
[ThreadStatic]
lugar deThreadLocal<T>
.fuente
ThreadLocal<T>
esté disponible en .NET 4 y versiones posteriores, y elThreadStatic
atributo también está disponible en 3.5 y versiones posteriores.ThreadLocal<T>
implementaIDisposable
y generalmente lo obliga a implementarIDisposable
también, lo que obliga a las personas que llaman a deshacerse de usted y, por lo tanto, implementarloIDisposable
también ...ThreadLocal
oThreadStatic
con subprocesos de grupo. Esos valores permanecerán durante toda la vida útil del subproceso del grupo, no solo para la tarea que le asigne. Eso puede causarle problemas de formas bastante no obvias. Consulte stackoverflow.com/questions/561518/… y preguntas similares para obtener más información.static
? Ver msdn.microsoft.com/en-us/library/…ThreadStatic Initialize solo en el primer subproceso, ThreadLocal Initialize para cada subproceso. A continuación se muestra la demostración simple:
fuente
La idea principal detrás de ThreadStatic es mantener una copia separada de la variable para cada hilo .
En el fragmento anterior, tenemos una copia separada de
value
para cada hilo, incluido el hilo principal.Por lo tanto, una variable ThreadStatic se inicializará a su valor predeterminado en otros subprocesos, excepto en el subproceso en el que se creó.
Si queremos inicializar la variable en cada hilo a nuestra manera, use ThreadLocal.
fuente