OK, domanda multi-threading newbie:Domanda multi-threading - aggiunta di un elemento a un elenco statico
Ho una classe Singleton. La classe ha un elenco statico ed essenzialmente funziona così:
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");
}
}
Fondamentalmente un utente può chiamare StartRecording() per inizializzare un elenco e quindi tutte le chiamate a un metodo grado possono aggiungere cose alla lista. Tuttavia, più thread possono contenere un'istanza su MyClass, quindi più thread possono aggiungere voci all'elenco.
Tuttavia, sia la creazione di liste che la lettura sono operazioni singole, quindi il solito problema di Reader-Writer nelle situazioni multi-threading non si applica. L'unico problema che ho potuto vedere è che l'ordine di inserimento è strano, ma non è un problema.
Posso lasciare il codice così com'è o devo prendere delle precauzioni per il multithreading? Dovrei aggiungere che nella vera applicazione questo non è un elenco di stringhe ma un elenco di oggetti personalizzati (quindi il codice è _list.Add (new Object (somedata))), ma questi oggetti contengono solo dati, nessun codice oltre a una chiamata a DateTime.Now.
Edit: Chiarimenti seguenti alcune risposte: DoSomething non può essere statico (la classe qui è abbreviato, c'è un sacco di roba in corso che utilizza istanze-variabili, ma queste creati dal costruttore e poi solo in lettura) . E 'abbastanza buono per fare
lock(_list){
_list.Add(something);
}
and
lock(_list){
return new List<string>(_list).AsReadOnly();
}
o ho bisogno un po' di magia più profondo?
Non è tipo di strano per essere miscelazione statica e single? Non dovresti tenere la tua collezione all'interno dell'istanza? – Will
Lo è, e sto considerando di rendere tutto statico. Volevo una sintassi concisa e per questo volevo un indicizzatore. Siccome C# non può fare indicizzatori statici, ho scelto l'approccio Singleton. Ma ora guardandolo è, quell'approccio aggiunge troppa confusione (e si sente semplicemente sbagliato) per un guadagno troppo scarso. –