Bon, débutant question multi-threading:Question multi-thread - ajout d'un élément à une liste statique
J'ai une classe Singleton. La classe a une liste statique et fonctionne essentiellement comme ceci:
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");
}
}
Fondamentalement, un utilisateur peut appeler StartRecording() pour initialiser une liste, puis tous les appels à une instance méthode peut ajouter des choses à la liste. Toutefois, plusieurs threads peuvent contenir une instance à MyClass, de sorte que plusieurs threads peuvent ajouter des entrées à la liste. Cependant, la création et la lecture d'une liste sont des opérations uniques, de sorte que le problème habituel du lecteur-enregistreur dans les situations de multithreading ne s'applique pas. Le seul problème que j'ai pu voir est que l'ordre d'insertion est bizarre, mais ce n'est pas un problème. Puis-je laisser le code tel quel ou dois-je prendre des précautions pour le multi-threading? Je dois ajouter que dans l'application réelle ce n'est pas une liste de chaînes mais une liste d'objets personnalisés (donc le code est _list.Add (new Object (somedata))), mais ces objets contiennent uniquement des données, pas de code en plus d'un appel à DateTime.Now.
Edit: Clarifications suivant quelques réponses: DoSomething ne peut pas être statique (la classe est abrégé ici, il y a beaucoup de choses en cours qui utilise instance des variables, mais celles-ci créées par le constructeur, puis lecture seule) . Est-il assez bon pour faire
lock(_list){
_list.Add(something);
}
and
lock(_list){
return new List<string>(_list).AsReadOnly();
}
ou ai-je besoin de la magie plus profond?
est-il pas de genre bizarre d'être mélange et singletons statique? Ne devriez-vous pas garder votre collection dans l'instance? – Will
Il est, et je considère tout rendre statique. Je voulais une syntaxe concise et pour cela je voulais un indexeur. Comme C# ne peut pas faire d'indexeurs statiques, j'ai choisi l'approche Singleton. Mais maintenant, en regardant c'est, cette approche ajoute trop de confusion (et se sent juste mal) pour un gain trop faible. –