2009-02-18 7 views
10

¿Se vuelven a utilizar los subprocesos de Backgroundworker?¿El almacenamiento local de subprocesos persiste entre las invocaciones de backgroundworker?

Específicamente, si configuro una ranura de datos con nombre (almacenamiento local de subprocesos) durante el método DoWork() de un backgroundworker, el valor de esa ranura de datos persistirá, posiblemente se encuentre algún otro subproceso en un momento posterior ?

yo no habría pensado así, pero tengo este error ...

EDIT: This blog post sugiere que BackGroundWorker utiliza un ThreadPool, lo que implica que los hilos son reutilizada. Entonces la pregunta es; ¿Los subprocesos reutilizados persisten potencialmente entre almacenamiento local de subprocesos?

Respuesta

7

Cuando el grupo de subprocesos reutiliza un subproceso, no borra los datos en el almacenamiento local de subprocesos o en los campos que están marcados con el atributo ThreadStaticAttribute. Por lo tanto, los datos que se colocan en un almacenamiento local de subprocesos mediante un método se pueden exponer a cualquier otro método que ejecute el mismo subproceso de grupo de subprocesos. Un método que accede a un campo que está marcado con el atributo ThreadStaticAttribute podría encontrarse con datos diferentes según el hilo del grupo de subprocesos que lo ejecute.

fuente: http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx

0

Tendría que verificar la fuente (o mediante Reflector) para determinar esto si no se especifica en MSDN.

Si no se especifica, no puede confiar en que el comportamiento actual no cambie en una versión futura de .NET.

Editar: Parece que está utilizando el grupo de subprocesos, por lo que los hilos serán reutilizados.

4

Bueno, internamente BackgroundWorker está utilizando BeginInvoke que significa (I creo) que está utilizando uno de los hilos de la ThreadPool. En cuanto a si TLS se borra cuando los hilos vuelven al grupo, no puedo decirlo con certeza.

En respuesta a la edición, nada de lo que he visto en Reflector sugiere que las ranuras TLS se borren o liberen una vez que se devuelvan al grupo. Por lo tanto, debe borrarlos explícitamente antes de que regrese su método DoWork.

+2

TLS no se borra cuando el hilo vuelve al subproceso del grupo "Cuando el grupo de subprocesos vuelve a utilizar un hilo, no borra los datos de hilo de almacenamiento local o en campos que están marcados con el atributo ThreadStaticAttribute. Por lo tanto, cuando un método examina el almacenamiento local de subprocesos o los campos que están marcados con el atributo ThreadStaticAttribute, los valores que encuentra pueden quedar de un uso anterior del subproceso de grupo de subprocesos ". 'FUENTE: [enlace] (http://msdn.microsoft.com/enus/library/system.threading.threadpool.aspx)' – Taher

Cuestiones relacionadas