-1
在下面的代码的NullReferenceException在ThreadStatic财产
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
}
}
我得到的NullReferenceException中的someMethod。我想,其他线程调用此方法,使乙空,但(如果我没有理解ThreadStatic)其他线程不应该被允许访问B.
我不能只用:
get
{
if (_b == null)
_b = new B();
}
因为改变B构造函数公开并以这种方式使用它会给我一个B的实例,其中一些属性(例如C)为空。
我也尝试在SomeMethod里面设置锁定 - 没有解决问题。
我想避免在classB中进行修改。没有它可以防止异常吗?
您还没有保证运营商新的访问_B之前调用每个线程,所以你基本上是问这种现象。执行ThreadStatic的正常方法是将其包装在一个静态属性中,如果该属性为空,则将该属性报告给支持字段。 – hoodaticus
@RomaDoskoch,我也是。 – hoodaticus
改为使用(ThreadLocal)[https://msdn.microsoft.com/en-us/library/dd642243(v = vs.110).aspx]。 –