2010-11-16 14 views

Odpowiedz

37

Można wskazać, że zmienne statyczne powinny być przechowywane per-thread pomocą atrybutu [ThreadStatic]:

[ThreadStatic] 
private static int foo; 
+0

Czy mogę przechowywać statyczną listę obiektów w wątku z tym atrybutem? –

+1

@DainiusKreivys Tak! Bez względu na typ zmiennej, unikalna instancja będzie utrzymywana dla każdego wątku, o ile użyjesz atrybutu "[ThreadStatic]". Zrobiłem szybki test używając '[ThreadStatic] prywatna lista statyczna foo = nowa lista {20, 30};'. Następnie, w innym wątku zainicjowałem tę samą zmienną foo z listą zawierającą trzy liczby całkowite i po zakończeniu tego wątku moja oryginalna lista zawierająca dwa elementy, o których mowa w wątku głównym, pozostała nienaruszona. – RBT

6

Inną opcją jest przechodzić w parametru do metody początek gwintu. Będziesz musiał zachować zakres, ale może być łatwiejsze do debugowania i utrzymywania.

15

Inna opcja w przypadku, gdy zakres jest problemem, który można wykorzystać. Nazwane gniazda danych np.

//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(); 

To jest tylko dobry pomysł, jeśli nie można zrobić to, co James Kovacs i AdamSane opisane

+0

Bez obaw, dziękuję za odpowiedź, pomogło mi to – NibblyPig

+2

Czy nazwane gniazda danych działają z nowym modelem 'asynchronicznego zadania'? Czy jest coś, co jest potrzebne, aby udostępnić slot w zadaniu? – Jaans

47

Jeśli używasz .NET 4.0 lub wyżej, o ile mi wiadomo, zalecanym sposobem jest użycie System.Threading.ThreadLocal<T>, który również daje leniwą inicjalizację jako bonus.

+6

Ta metoda nie jest również ograniczona do pól statycznych. –

Powiązane problemy