2010-11-16 15 views

Respuesta

37

puede indicar que las variables estáticas deben almacenarse por subproceso mediante el atributo [ThreadStatic]:

[ThreadStatic] 
private static int foo; 
+0

¿Puedo almacenar la lista estática de objetos por subproceso con este atributo? –

+1

@DainiusKreivys ¡Sí! No importa cuál sea el tipo de variable, su instancia única se mantendrá por hilo siempre que use el atributo '[ThreadStatic]'. Hice una prueba rápida usando '[ThreadStatic] private static List foo = new List {20, 30};'. Luego, en otro hilo inicialicé la misma variable foo con una lista que contenía tres enteros y cuando ese hilo terminó, mi lista original que contenía dos elementos referidos por el hilo principal permaneció intacta. – RBT

6

Otra opción es pasar de un parámetro en el método de inicio de la rosca. Deberá mantener el alcance, pero puede ser más fácil de depurar y mantener.

15

Otra opción en el caso de que alcance es un problema que puede utilizar Ranuras de datos con nombre p.

//setting 
    LocalDataStoreSlot lds = System.Threading.Thread.AllocateNamedDataSlot("foo"); 
    System.Threading.Thread.SetData(lds, "SomeValue"); 

    //getting 
    LocalDataStoreSlot lds = System.Threading.Thread.GetNamedDataSlot("foo"); 
    string somevalue = System.Threading.Thread.GetData(lds).ToString(); 

Ésta es sólo una buena idea si usted no puede hacer lo que James Kovacs y AdamSane describen

+0

sin preocupaciones, gracias por la respuesta, me ayudó – NibblyPig

+2

¿Funcionan las ranuras de datos con el nuevo modelo 'async Task'? ¿Se necesita algo más para hacer que una ranura esté disponible en la tarea? – Jaans

47

Si utiliza .Net 4.0 o superior, por lo que yo sé, el método recomendado es utilizar System.Threading.ThreadLocal<T> que también da inicialización perezosa como una bonificación.

+6

Este método tampoco está limitado a campos estáticos. –

Cuestiones relacionadas