我发现“ThreadStatic”属性是极其有用的最近的,但现在让我想“ThreadLocal的”类型的属性,让我有非静态数据成员在每个线程的基础。C#是否具有“ThreadLocal”模拟(用于数据成员)到“ThreadStatic”属性?
现在我知道,这将有一些不平凡的意义,但:
难道这样的事情存在已内置到C#/。NET?或者因为它看起来到目前为止的答案是否定的(对于.net < 4.0),那里是否有常用的实现?
我可以想出一个合理的方法来实现它自己,但只是使用一些已经存在的东西,如果它是可用的。
将实现什么我要找的,如果它已经不稻草人例如存在:
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; }
}
}
请原谅任何C#无知。我是一位C++开发人员,最近才开始研究C#和.NET的更有趣的功能.net
我仅限于.net 3.0,也许3.5(项目已经/很快将移动到3.5)。
具体使用情况是,在线程特定(使用虚构[ThreadLocal的]属性)回调列表一拉:
class NonSingletonSharedThing
{
[ThreadLocal] List<Callback> callbacks;
public void ThreadLocalRegisterCallback(Callback somecallback)
{
callbacks.Add(somecallback);
}
public void ThreadLocalDoCallbacks();
{
foreach(var callback in callbacks)
callback.invoke();
}
}
我看不出有什么不同。如果数据是每个线程,为什么不是ThreadStatic你需要什么?换句话说,当地对什么? – 2010-01-29 15:29:41
这就是为什么我提供了这个例子。我正在为每个类寻找每个非静态数据成员。 ThreadStatic仅适用于静态数据成员。 – Catskul 2010-01-29 15:49:10
我很好奇,这是什么用例?如果对象绑定到局部变量,那么它和它的所有成员实际上是线程局部的。如果对象绑定到一个全局变量,全局的ThreadStatic将使它(和它的成员)成为本地线程。该对象需要共享线程本地存储才有用,它是如何共享的,以便选定的成员有效地成为线程本地? – 2010-02-02 01:16:41