2017-03-03 39 views
-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中进行修改。没有它可以防止异常吗?

+0

您还没有保证运营商新的访问_B之前调用每个线程,所以你基本上是问这种现象。执行ThreadStatic的正常方法是将其包装在一个静态属性中,如果该属性为空,则将该属性报告给支持字段。 – hoodaticus

+0

@RomaDoskoch,我也是。 – hoodaticus

+1

改为使用(ThreadLocal)[https://msdn.microsoft.com/en-us/library/dd642243(v = vs.110).aspx]。 –

回答