2008-09-25 9 views
9

El ThreadStatic attribute declara una variable estática como única por subproceso. ¿Conoces un patrón fácil para eliminar correctamente esas variables?Eliminación determinista de objetos ThreadStatic

Lo que utilizamos antes de ThreadStatic es un ThreadContextManager. A cada subproceso se le asignó un ThreadContext que conservaba toda la información específica de subprocesos. Engendramos algunos hilos y los dejamos trabajar. Luego, cuando todos terminaron, eliminamos ThreadContentManager, que a su vez eliminó todos los contextos si eran IDisposables.

No veo una manera inmediata de traducir este patrón a objetos ThreadStatic. Los objetos se descartarán de forma eventual, porque los hilos se mueren, por lo que nada los referencia. Sin embargo, preferimos disponer de determinista siempre que sea posible.

actualización

Realmente no controlo los hilos directamente - Estoy usando Microsoft CCR, que tiene una ThreadPool que hace tareas. Cuando finalicen todas las tareas, eliminaré Dispatcher (que contiene el grupo de subprocesos). La cuestión es que no tengo la oportunidad de hacer nada "al final de la función principal de un hilo", así que no puedo deshacerme de las cosas manualmente al final de la ejecución de un hilo. ¿Puedo acceder a los objetos estáticos del hilo desde fuera del hilo de alguna manera?

Respuesta

1

Aún puede utilizar el equivalente de su clase ThreadContextManager para manejar el desecho. Los hilos engendrados disponen de este objeto 'administrador' que a su vez elimina todos los otros objetos estáticos de hilo que conoce.

Prefiero tener relativamente pocos objetos estáticos de subprocesos y utilizar un objeto de contexto en su lugar. Esto mantiene el estado específico de la hebra solo en unos pocos lugares, y hace que los patrones como este sean más fáciles.

Actualización: para manejar la caja de subprocesos puede crear un objeto base de 'tarea' que es el que pasa al grupo de subprocesos. Puede realizar cualquier inicialización genérica que necesite su código, invocar la tarea 'real' y luego realizar cualquier limpieza necesaria.

+0

No quiero limpiar después de cada tarea. Cualquier hilo dado en mi grupo de trabajo hace muchas tareas secuencialmente. La razón por la que tiene contexto es para ahorrar costosas asignaciones de estructuras de datos por tarea. Esto significa que solo puedo limpiar después de que todos los hilos hayan terminado. – ripper234

Cuestiones relacionadas