Podczas gdy odpowiedź na this question jest doskonała, oznacza to, że należy otoczyć wywołania List.ToArray() w zamku dla współbieżności. this blog post oznacza również, że może zawieść katastrofalnie (ale rzadko). Zwykle używam ToArray zamiast blokowania podczas wyliczania list lub innych kolekcji w celu uniknięcia wyjątku "Modified Collection, Enumeration may complete". Ta odpowiedź i post na blogu zakwestionowały to założenie.Czy ToArray() może wyrzucić wyjątek?
Dokumentacja dla List.ToArray() nie zawiera żadnych wyjątków, więc zawsze zakładałem, że zawsze będzie ona kompletna (choć może z nieaktualnymi danymi) i że nie jest bezpieczna dla wątków z punktu widzenia spójności danych , jest bezpieczny dla wątków z punktu widzenia wykonania kodu - innymi słowy, nie wyrzuci wyjątku i wywołanie go nie uszkodzi wewnętrznej struktury danych podstawowej kolekcji.
Jeśli to założenie nie jest poprawne, to mimo że nigdy nie spowodowało problemu, może to być timebomb w aplikacji wysokiej dostępności. Jaka jest ostateczna odpowiedź?
Lista. ADD nie rzuca również wyjątku, jeśli inne wątki modyfikują listę w tym samym czasie. Nadal nie jest bezpieczny dla wątków. Po prostu sprawdza, czy nie modyfikujesz i nie wyliczasz go w tym samym czasie w tym samym wątku. Co sprawia, że uważasz, że metoda, która nie została udokumentowana jako bezpieczna dla wątków, może być bezpieczna dla wątków? (Zakładając, że mówisz listy .ToArray lub Enumerable.ToArray. ConcurrentBag .ToArray jest thread-safe, jak wylicza się ConcurrentBag bez ToArray.) –
dtb
I zawężony zakres pytania skupić się na listy i listy ponieważ to one są dla mnie najbardziej niepokojące. Widziałem tę technikę stosowaną w wielu popularnych frameworkach open source, więc nie sądzę, że jestem jedynym, który zakłada założenie o "bezpieczeństwie" tej techniki. Nie pytam, czy są bezpieczne dla wątków (z definicji nie są), ale czy powinienem rozpocząć wyszukiwanie i naprawianie wystąpień "niebezpiecznych" wywołań ToArray()? –
Czy jesteś pewien, że te frameworki open source używają ToArray zamiast blokady, czy też używają ToArray do modyfikowania listy podczas wyliczania jej w tym samym wątku? – dtb