Okay, Neuling Multi-Threading Frage:
Ich habe eine Singleton-Klasse. Die Klasse hat eine statische Liste und funktioniert im Wesentlichen wie folgt:
class MyClass {
private static MyClass _instance;
private static List<string> _list;
private static bool IsRecording;
public static void StartRecording() {
_list = new List<string>();
IsRecording = true;
}
public static IEnumerable<string> StopRecording() {
IsRecording = false;
return new List<string>(_list).AsReadOnly();
}
public MyClass GetInstance(){
}
public void DoSomething(){
if(IsRecording) _list.Add("Something");
}
}
Grundsätzlich kann ein Benutzer StartRecording() aufrufen, um eine Liste zu initialisieren, und dann können alle Aufrufe einer Instanz-Methode der Liste etwas hinzufügen. Allerdings können mehrere Threads eine Instanz von MyClass halten, so dass mehrere Threads Einträge zur Liste hinzufügen können.
Allerdings sind sowohl das Erstellen als auch das Lesen von Listen Einzeloperationen, so dass das übliche Reader-Writer-Problem in Situationen mit mehreren Threads nicht zutrifft. Das einzige Problem, das ich sehen könnte, ist, dass die Einfügereihenfolge seltsam ist, aber das ist kein Problem.
Kann ich den Code so belassen, wie er ist, oder muss ich irgendwelche Vorkehrungen für Multithreading treffen? Ich sollte hinzufügen, dass es sich in der realen Anwendung nicht um eine Liste von Strings, sondern um eine Liste von benutzerdefinierten Objekten handelt (der Code lautet also _list.Add(new Object(somedata))), aber diese Objekte enthalten nur Daten, keinen Code außer einem Aufruf von DateTime.Now.
Bearbeiten: Klarstellungen nach einigen Antworten: DoSomething kann nicht statisch sein (die Klasse ist hier abgekürzt, es gibt eine Menge Dinge, die Instanzvariablen verwenden, aber diese werden vom Konstruktor erzeugt und dann nur gelesen). Ist es gut genug zu tun
lock(_list){
_list.Add(something);
}
and
lock(_list){
return new List<string>(_list).AsReadOnly();
}
oder brauche ich einen tieferen Zauber?