Serán los valores de las variables en mis ThreadStatic todavía estará allí cuando un ciclo a través de ThreadPool?

StackOverflow https://stackoverflow.com/questions/854976

Pregunta

Estoy utilizando las variables ThreadStatic para almacenar algunos datos, pero me preocupa que los datos almaceno en el hilo todavía estará allí después que haya terminado con él y suelte de nuevo a la ThreadPool. ¿Es necesario que preocuparse de la limpieza de mi variables ThreadStatic antes de que haya terminado con el hilo? O el ThreadPool hacer esto por mí antes de "pasar hacia fuera" para la próxima QueueUserWorkItem? Esto es especialmente importante para mí porque necesito para asegurarse de que otros hilos en mi aplicación tienen una pizarra limpia para trabajar desde en términos de variables ThreadStatic. Gracias!

¿Fue útil?

Solución

El grupo de subprocesos (por diseño) mantiene los hilos vivos entre llamadas. Esto significa que las variables ThreadStatic persistirán entre llamadas a QueueUserWorkItem.

Este comportamiento también es algo que no debe contar. ThreadPool será (con el tiempo, a su discreción) hilos de liberación hacia atrás y dejar que ellos extremo, y la construcción de nuevos temas, según sea necesario.

Sin embargo, me pregunta su diseño si se está ejecutando a tener problemas con esto. Si necesita datos específicos, ThreadStatic deterministas para ser utilizado en QueueUserWorkItem, sus rutinas de roscado podrían ser buenos candidatos para hacer el manejo de sí mismo hilo. ThreadStatic y ThreadPool no siempre son una gran combinación - simplemente no necesariamente tiene suficiente control (ya que el ThreadPool maneja los hilos) para realmente aprovechar y obtener beneficios a partir de variables ThreadStatic. Nunca se sabrá si dos elementos de trabajo estarán en el mismo hilo, hilos diferentes, y si la variable threadstatic debe ser (re) inicializada, etc.

Otros consejos

espero que permanecerían entre los métodos. Por supuesto, en caso de duda, restablecer las variables de subproceso estática en el inicio de su método de trabajo. O utilizar try / finally para borrar los valores después cada unidad de trabajo.

(editar)

Es bastante fácil demostrar que efectivamente se mantienen; lo anterior se inicia rápidamente números de impresión superiores a 0 (donde 0 cada vez que es lo que cabría esperar si se aislaron los diferentes trabajadores):

[STAThread]
static void Main()
{
    for (int i = 0; i < 50; i++)
    {
        ThreadPool.QueueUserWorkItem(DoStuff);
    }
    Console.ReadLine();
}
static void DoStuff(object state)
{
    Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": " + value++);
    Thread.Sleep(20);
}
[ThreadStatic]
static int value;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top