2017-03-03 3 views
-1

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?

+0

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

+0

@RomaDoskoch, ich auch. – hoodaticus

+1

Verwenden Sie stattdessen (ThreadLocal) [https://msdn.microsoft.com/en-us/library/dd642243 (v = vs.110) .aspx]. –

Antwort

Verwandte Themen