Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Puede usar el almacenamiento local del subproceso administrado (TLS) para almacenar datos que son únicos para un subproceso y un dominio de aplicación. .NET proporciona dos maneras de usar TLS administrado: campos estáticos relativos a subprocesos y ranuras de datos.
Use campos estáticos relativos a subprocesos (campos relativos
Shared
a subprocesos en Visual Basic) si puede prever sus necesidades exactas en tiempo de compilación. Los campos estáticos relativos a subprocesos proporcionan el mejor rendimiento. También proporcionan las ventajas de la comprobación de tipos en tiempo de compilación.Use las ranuras de datos si se pueden detectar los requisitos reales solo en tiempo de ejecución. Las ranuras de datos son más lentas y difíciles de usar que los campos estáticos relativos al hilo, y los datos se almacenan como tipo Object, por lo que debe convertir los datos al tipo correcto antes de usarlos.
En C++no administrado, se usa TlsAlloc
para asignar ranuras dinámicamente y __declspec(thread)
para declarar que se debe asignar una variable en el almacenamiento relativo al subproceso. Los campos estáticos y las ranuras de datos relativos a subprocesos proporcionan la versión administrada de este comportamiento.
Puede usar la clase System.Threading.ThreadLocal<T> para crear objetos locales de subprocesos que se inicializan de forma diferida la primera vez que se usa el objeto. Para obtener más información, consulte Inicialización diferida.
Unicidad de los datos en TLS administrado
Si usa los campos estáticos o las ranuras para datos relacionados con subprocesos, los datos de la TLS administrada son exclusivos de la combinación de subproceso y dominio de aplicación.
Dentro de un dominio de aplicación, un subproceso no puede modificar datos de otro subproceso, incluso cuando ambos subprocesos usan el mismo campo o ranura.
Cuando un subproceso accede al mismo campo o ranura desde varios dominios de aplicación, se mantiene un valor independiente en cada dominio de aplicación.
Por ejemplo, si un subproceso establece el valor de un campo estático relativo al subproceso, escribe otro dominio de aplicación y, a continuación, recupera el valor del campo, el valor recuperado en el segundo dominio de aplicación difiere del valor del primer dominio de aplicación. Establecer un nuevo valor para el campo en el segundo dominio de aplicación no afecta al valor del campo en el primer dominio de aplicación.
Del mismo modo, cuando un subproceso obtiene la misma ranura de datos con nombre en dos dominios de aplicación diferentes, los datos del primer dominio de aplicación permanecen independientes de los datos del segundo dominio de aplicación.
Thread-Relative campos estáticos
Si sabe que un fragmento de datos siempre es único para un subproceso y una combinación de dominio de aplicación, aplique el ThreadStaticAttribute atributo al campo estático. Use el campo como usaría cualquier otro campo estático. Los datos del campo son únicos para cada subproceso que lo usa.
Los campos estáticos relacionados con subprocesos ofrecen mayor rendimiento que las ranuras para datos y, además, tienen la ventaja de la comprobación de tipos en tiempo de compilación.
Tenga en cuenta que cualquier código de constructor de clase se ejecutará en el primer subproceso del primer contexto que tenga acceso al campo. En todos los demás subprocesos o contextos del mismo dominio de aplicación, los campos se inicializarán en null
(Nothing
en Visual Basic) si son tipos de referencia o a sus valores predeterminados si son tipos de valor. Por lo tanto, no debe confiar en los constructores de clase para inicializar los campos estáticos específicos del subproceso. En su lugar, evite inicializar campos estáticos relativos al subproceso y suponga que se inicializan en null
(Nothing
) o en sus valores predeterminados.
Ranuras para datos
.NET proporciona ranuras de datos dinámicas que son únicas para una combinación de subprocesos y dominio de aplicación. Hay dos tipos de ranuras de datos: ranuras con nombre y ranuras sin nombre. Ambos se implementan mediante la LocalDataStoreSlot estructura .
Para crear una ranura de datos con nombre, use el Thread.AllocateNamedDataSlot método o Thread.GetNamedDataSlot . Para obtener una referencia a una ranura con nombre existente, pase su nombre al GetNamedDataSlot método .
Para crear una ranura de datos sin nombre, use el Thread.AllocateDataSlot método .
Para las ranuras con nombre y sin nombre, use los métodos Thread.SetData y Thread.GetData para establecer y recuperar la información en la ranura. Estos son métodos estáticos que siempre actúan sobre los datos del subproceso que los está ejecutando actualmente.
Las ranuras con nombre pueden ser prácticas, porque puede recuperar la ranura cuando lo necesite pasando su nombre al método GetNamedDataSlot, en lugar de mantener una referencia a una ranura sin nombre. Sin embargo, si otro componente usa el mismo nombre para su almacenamiento relativo al subproceso y un subproceso ejecuta código tanto del componente como del otro, los dos componentes podrían dañar los datos de los demás. (En este escenario se supone que ambos componentes se ejecutan en el mismo dominio de aplicación y que no están diseñados para compartir los mismos datos).