-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]。 –