2016-03-29 13 views
3

Ich habe unter Klassen:Ist diese statische Methode threadsicher?

public static class MetadataManager 
{ 
    // assume that it is thread safe 
    public static List<Field> FieldRegistry { get; set; } 
} 

public class Field 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 



public static class FieldDataValidationManager 
{ 
    public static bool Validate(int fieldID) 
    { 
     return MetadataManager.FieldRegistry.FirstOrDefault(f => f.ID == fieldID).ID > 1; 
    } 

    public static bool Validate(Field field) 
    { 
     return fieldID.ID > 1; 
    } 
} 

Jetzt User1 und User2 zugleich statische Methode ruft, ist es irgendein Problem in Bezug auf Parallelität?

FieldDataValidationManager.Validate(111) 

oder Benutzer1 ausgeführt FieldDataValidationManager.Validate(field1) und User2 ist FieldDataValidationManager.Validate(field2)

Antwort

8

Ja Ausführung, Ihr Code ist Thread-sicher, da der Code nur aus der Liste zu lesen. Statisch zu sein oder nicht ist egal.

Wenn es Schreibvorgänge auf dem List<T> gäbe, hätten Sie möglicherweise Probleme mit dem gemeinsamen Zugriff. Dann sollten Sie ConcurrentBag<T> oder andere thread-sichere Sammlungstypen verwenden.

3

Es gibt kein Nebenläufigkeitsproblem, solange Sie den Inhalt der FieldRegistry Liste nicht ändern.
Aber Sie haben nicht angezeigt, wo Sie diese Liste füllen. Also, wenn Ihr tatsächlicher Code Einträge in diese Liste einfügt oder entfernt, während andere Threads Validate aufrufen, wird es Probleme geben (eine ConcurrentBag<T>, wie von Patrick Hofman vorgeschlagen, könnte eine gute Alternative dafür sein).


Aber was Sie tatsächlich versuchen, hier zu tun:

public static bool Validate(int fieldID) 
{ 
    return MetadataManager.FieldRegistry.FirstOrDefault(f => f.ID == fieldID).ID > 1; 
} 

So scheint es, Ihre fieldID gültig ist, wenn bereits ein Eintrag mit diesem IDund die ID größer als 1?
OK, aber Ihre Methode wird eine NullReferenceException werfen, wenn die fieldID nicht bereits in Ihrer Liste enthalten ist. Also ändern Sie diese Methode besser in etwas wie diese:

public static bool Validate(int fieldID) 
{   
    return 
     MetadataManager.FieldRegistry.Any(f => f.ID == fieldID) && 
     fieldID > 1; 
} 
+0

Lieber Rene. Ich stimme dir zu, aber es ist nur zum Beispiel. – Tim