2010-11-16 6 views

ответ

37

Вы можете указать, что статические переменные должны быть сохранены для каждого потока с помощью атрибута [ThreadStatic]:

[ThreadStatic] 
private static int foo; 
+0

Могу ли я хранить статический список объектов в потоке с этим атрибутом? –

+1

@DainiusKreivys Да! Независимо от типа переменной, ее уникальный экземпляр будет поддерживаться в каждом потоке, если вы используете атрибут '[ThreadStatic]'. Я сделал быстрый тест, используя '[ThreadStatic] приватный статический список foo = new Список {20, 30};'. Затем в другом потоке я инициализировал ту же переменную foo с списком, содержащим три целых числа, и когда этот поток завершил мой исходный список, содержащий два элемента, упомянутых главным потоком, остался неповрежденным. – RBT

6

Другой вариант передать в качестве параметра в методе запуска нити. Вам нужно будет оставаться в области видимости, но это может быть проще отлаживать и поддерживать.

15

Другой вариант в случае, когда область действия является проблемой, вы можете использовать Именованные слоты данных , например.

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

Это только хорошая идея, если вы не можете делать то, что Джеймс Ковач и AdamSane описал

+0

не заботится, спасибо за ответ, это помогло мне – NibblyPig

+2

Именованные слоты данных работают с новой моделью 'async Task'? Есть ли что-то лишнее, чтобы сделать слот доступным в задаче? – Jaans

47

Если вы используете .NET 4.0 или выше, насколько я знаю, рекомендуемый способ заключается в использовании System.Threading.ThreadLocal<T>, который также дает ленивую инициализацию в качестве бонуса.

+6

Этот метод также не ограничивается статическими полями. –

Смежные вопросы