Я обнаружил, что атрибут "ThreadStatic" чрезвычайно полезен в последнее время, но теперь мне нужен атрибут типа "ThreadLocal", который позволяет мне иметь нестатические элементы данных для каждой строки.
Теперь я знаю, что это будет иметь некоторые нетривиальные последствия, но:
Существует ли такая вещь, уже встроенная в С#/. net?, или поскольку она пока показывается, что ответ на это нет (для .net < 4.0), есть ли обычно используемое реализация там?
Я могу придумать разумный способ реализовать его сам, но просто использовал бы что-то, что уже существовало, если оно было доступно.
Straw Man пример, который будет реализовывать то, что я ищу, если оно еще не существует:
class Foo
{
[ThreadStatic]
static Dictionary<Object,int> threadLocalValues = new Dictionary<Object,int>();
int defaultValue = 0;
int ThreadLocalMember
{
get
{
int value = defaultValue;
if( ! threadLocalValues.TryGetValue(this, out value) )
{
threadLocalValues[this] = value;
}
return value;
}
set { threadLocalValues[this] = value; }
}
}
Прошу простить любое незнание С#. Я разработчик С++, который только недавно попадал в более интересные функции С# и .net
Я ограничен .net 3.0 и, возможно, 3.5 (у проекта есть/скоро переместится на 3.5).
Конкретный прецедент - это списки обратного вызова, которые являются специфичными для потока (с использованием воображаемого атрибута [ThreadLocal]) a la:
class NonSingletonSharedThing
{
[ThreadLocal] List<Callback> callbacks;
public void ThreadLocalRegisterCallback( Callback somecallback )
{
callbacks.Add(somecallback);
}
public void ThreadLocalDoCallbacks();
{
foreach( var callback in callbacks )
callback.invoke();
}
}