Каков наилучший способ сохранить некоторую переменную локально для каждого потока?
Локальное хранилище
Ответ 1
Вы можете указать, что статические переменные должны храниться в потоке с помощью атрибута [ThreadStatic]
:
[ThreadStatic]
private static int foo;
Ответ 2
Если вы используете .Net 4.0 или выше, насколько мне известно, рекомендуется использовать System.Threading.ThreadLocal<T>
, который также дает ленивую инициализацию в качестве бонуса.
Ответ 3
Другой вариант в том, что область действия - проблема, вы можете использовать именованные слоты данных например.
//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();
Это только хорошая идея, если вы не можете сделать то, что описал Джеймс Ковач и Адамсайн
Ответ 4
Другой вариант - передать параметр в метод запуска потока. Вам нужно будет оставаться в области видимости, но может быть проще отлаживать и поддерживать.