Im folgenden Codebei Nullreferenceexception Threadstatic Eigenschaft
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
}
}
i erhalten Nullreferenceexception in Somemethod. Ich nehme an, dass andere Thread diese Methode aufruft und macht B null, aber (wenn ich Threadstatic verstehen) andere Threads zu vermeiden, dürfen B. den Zugriff auf
Ich kann nicht einfach verwenden:
get
{
if (_b == null)
_b = new B();
}
weil Ändern Der B-Konstruktor für die Öffentlichkeit und die Verwendung auf diese Weise geben mir eine Instanz von B mit einigen Eigenschaften (z. B. C), die null sind.
Ich habe auch versucht, Sperre in SomeMethod setzen - löste das Problem nicht.
Ich möchte Änderungen in Klasse B vermeiden. Ist es möglich, Ausnahmen ohne sie zu verhindern?
Sie haben nicht garantiert, dass Betreiber neu auf jedem Thread vor dem Zugriff auf _b genannt wird, so haben Sie im Wesentlichen für dieses Fehlverhalten gefragt. Der normale Weg, um ThreadStatic zu machen, besteht darin, es in eine statische Eigenschaft zu verpacken, die das Hintergrund-Feld aktualisiert, wenn es null ist. – hoodaticus
@RomaDoskoch, ich auch. – hoodaticus
Verwenden Sie stattdessen (ThreadLocal) [https://msdn.microsoft.com/en-us/library/dd642243 (v = vs.110) .aspx]. –