2017-03-03 97 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]。 –

回答