Mam ObservableCollection kłód, że mam związany z moim GUI poprzez właściwośćCzy bezpieczny jest .NET ObservableCollection <> ToList()? Jeśli nie, jak postępować
public ObservableCollection<ILog> Logs {get; private set;}
Jest to wymóg, aby pokazać podzbiór dzienników gdzieś indziej, więc mam:
public ObservableCollection<ILog> LogsForDisplay
{
get
{
ObservableCollection<ILog> displayLogs = new ObservableCollection<ILog>();
foreach (Log log in Logs.ToList()) // notice the ToList()
{
if (log.Date != DateTime.Now.Day)
continue;
displayLogs.Add(log);
}
return displayLogs;
}
Przed I dodaje „ToList()” mam wyjątki od czasu do czasu o „Kolekcja została zmodyfikowana; operacja wyliczania nie może wykonać” to ma sens - ktoś może dodać do rejestru, a ja jestem iteracji nad nim. Wpadłem na pomysł "ToList" z Collection was modified; enumeration operation may not execute, który wydaje się sugerować, że ToList to sposób na udanie się i sugeruje, że jest bezpieczny dla wątków. Ale czy wątek ToList() jest bezpieczny? Zakładam, że wewnętrznie musi korzystać z listy i iterować nad nią? A co, jeśli ktoś doda do tej listy w tym samym czasie? To, że nie widziałem problemu, nie oznacza, że go nie ma.
Moje pytanie. Czy wątek ToList() jest bezpieczny, a jeśli nie, jaki jest najlepszy wzór do ochrony dzienników? Jeśli funkcja ToList() jest bezpieczna dla wątków, czy masz referencję?
Dodatkowe pytanie. Jeśli wymagania zmieniły się i wszystko, co musiałem wyświetlić w GUI, to LogsForDisplay i NOT Logs, czy mogę zmienić Logi na coś innego, co rozwiąże problem? Takich jak ImmutableList? Wtedy nie musiałbym wywoływać ToList <> której założenie zajmuje trochę czasu, aby wykonać kopię.
Daj mi znać, jeśli mogę udzielić wyjaśnień. Dzięki,
Dave
[Dokumentacja] (https://msdn.microsoft.com/en-us/library/ms668604%28v=vs.110%29.aspx) nie gwarantuje żadnej użytecznej metody ani właściwości do zabezpieczenia wątków, w związku z tym należy założyć, że wszyscy nie są. Możesz przejść do metody 'lock' in you logowania (gdzie dodajesz do kolekcji' Logs') i dookoła 'ToList'. Wydaje się, że jest to tylko pewien sposób na rozwiązanie tego problemu. Prawdopodobnie zastąp wszystkie metody wstawiania itd. W klasie pochodzące z 'ObservableCollection', aby zablokować za pomocą [' SyncRoot'] (https://msdn.microsoft.com/en-us/library/bb353794 (v = vs.110) .aspx) własność. – slawekwin
Wszystkie dobre odpowiedzi i dziękuję wszystkim! Może tylko wybrać 1 niestety. – Dave