OK, pytanie początkujących wielowątkowych:Pytanie wielowątkowe - dodawanie elementu do listy statycznej
Mam lekcję Singleton. Klasa ma statyczną listę i zasadniczo działa tak:
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");
}
}
Zasadniczo użytkownik może zadzwonić StartRecording(), aby zainicjować listy, a następnie wszystkie połączenia do metody instancji może dodać rzeczy do listy. Jednak wiele wątków może przechowywać instancję w MyClass, więc wiele wątków może dodawać wpisy do listy.
Jednak tworzenie i odczyt list są pojedynczymi operacjami, więc zwykły problem z pisarzem i pisarzem w sytuacjach wielowątkowych nie ma zastosowania. Jedyny problem, jaki mogłem zauważyć, to kolejność wstawiania, która jest dziwna, ale to nie jest problem.
Czy mogę pozostawić kod bez zmian, czy też muszę przedsięwziąć środki ostrożności w przypadku wielowątkowości? Powinienem dodać, że w prawdziwej aplikacji nie jest to lista łańcuchów, ale lista obiektów niestandardowych (tak więc kod jest _list.Add (nowy obiekt (somedata))), ale te obiekty przechowują tylko dane, bez kodu poza wywołaniem do DateTime.Now.
Edit: Wyjaśnienia po kilka odpowiedzi: DoSomething nie może być statyczny (klasa jest tu w skrócie, jest wiele rzeczy dzieje się, że jest za pomocą instancji zmiennych, ale te stworzone przez konstruktora, a potem tylko do odczytu) . Czy jest wystarczająco dobry, aby zrobić
lock(_list){
_list.Add(something);
}
and
lock(_list){
return new List<string>(_list).AsReadOnly();
}
czy muszę jakąś głębszą magię?
Czy to nie jest trochę dziwne być mieszające statyki i samotnymi? Czy nie powinieneś po prostu zachować swojej kolekcji w instancji? – Will
Jest i rozważam, aby wszystko było statyczne. Chciałem zwięzłej składni i do tego chciałem Indexer. Ponieważ C# nie może wykonywać indeksatorów statycznych, wybrałem podejście Singleton. Ale patrząc na to, podejście to wprowadza zbyt wiele zamieszania (i po prostu wydaje się nie tak), dla zbyt małego zysku. –