在以下代码中
public class ClassA
{
[ThreadStatic]
private static ClassB _b;
protected static B
{
get { return _b; }
set { _b = value; }
}
...
public void SomeMethod(Data data)
{
...
B.SomeVoidMethod(data);
...
B = null;
}
}
public class ClassB
{
private ClassB() {}
private ClassC _c;
public C
{
get { return _c; }
}
public static ClassB MyMethod(Data data)
{
ClassB b = new ClassB();
b._c = C.GetObject(data);
return b
}
}
我在SomeMethod中得到NullReferenceException。我想其他线程调用此方法并使B null,但(如果我理解ThreadStatic)不应允许其他线程访问B.
我不能只使用:
get
{
if (_b == null)
_b = new B();
}
因为将B构造函数更改为public并以这种方式使用它会给我一个B实例,其中一些属性(例如C)为null。
我也尝试在SomeMethod中设置锁定 - 没有解决问题。
我想避免在classB中进行修改。没有它可以防止例外吗?
答案 0 :(得分:1)
ThreadStatic意味着每个线程都有自己的字段版本。您正在获取NullReferenceExceptions,因为您没有初始化正在访问它的线程上的字段。
从文档的最顶层开始:“表示静态字段的值对于每个线程都是唯一的。”
https://msdn.microsoft.com/en-us/library/system.threadstaticattribute(v=vs.110).aspx