Czy obsada z ConcurrentDictionary do IDictionary odcięła implementację wątkową, ponieważ IDictionary nie ma metod GetOrAdd i AddOrUpdate?Przesyłanie z ConcurrentDictionary do IDictionary
Odpowiedz
Obiekt wynikowy nadal będzie słownikiem współbieżnym. Połączenia takie jak Dodaj lub Usuń używają podstawowej implementacji TryAdd i TryRemove (które są wątkowo bezpieczne). Przesyłanie obiektu do innego typu nie zmienia samego obiektu.
Ponadto, w celu wyjaśnienia, można użyć narzędzi takich jak ILSpy, aby zobaczyć, jaka jest implementacja domyślnych metod IDictionary i czy nadal będą bezpieczne dla wątków.
Możesz również zajrzeć do dokumentacji MSDN dla implementacji ConcurrentDictionary z 'IDictionary
IDictionary
to tylko interfejs. Jeśli rzutujesz na niego, wynikiem jest implementacja ConcurrentDictionary, brak metod GetOrAdd
i AddOrUpdate
.
Można przypuszczać, że nadal można użyć właściwości Item
i metod Add
i ContainsKey
(w miejsce GetOrAdd
i AddOrUpdate
) metod, a lanego obiekt nadal będzie bezpieczny wątku (od wdrożenie bazowym jest ConcurrentDictionary
).
To byłoby jak patrząc na dużym ConcurrentDictionary
obiektu poprzez IDictionary
w kształcie dziurki od klucza - można zobaczyć tylko IDictionary
kształt, ale to i tak będzie ConcurrentDictionary
.
Krótka odpowiedź nr.
Manipulujesz obiektem za pomocą interfejsu, a zatem nadal używasz konkretnej implementacji. Nie tracisz żadnej funkcjonalności ani jej metod. Po prostu nie są dostępne.
Na marginesie potrzebna jest wyraźna obsada podczas downcastingu, nie ma potrzeby wyraźnego rzucania podczas upcastingu - zawsze jest to bezpieczne.
Niestety, ConcurrentDictionary dodać dwa nowe metody i ukrywanie innych, więc jego implementacja może dodać wątek bezpieczny tylko dla nowych metod, a nie dla ukrytych metod. Dokumentacja MSDN nie wyjaśnia tego, więc zadałem to pytanie.Ale po przeczytaniu najlepszych komentarzy i przyjrzeniu się prototypowi ConcurrentDictionary zobaczyłem, co nie rozszerza słownika, a to uspokoiło mnie, że jest nieprawdopodobne, że przekazanie go do IDictionary będzie pośrednio korzystać ze Słownika w wersji rozszerzonej. – Luciano
- 1. Najlepszy sposób na przetłumaczenie z IDictionary na ogólne IDictionary
- 2. Sortowanie ConcurrentDictionary przez wartość
- 3. Wyliczanie i blokowanie ConcurrentDictionary
- 4. operacje LINQ na IDictionary
- 5. Convert Lista KeyValuePair do IDictionary "C#"
- 6. Jak zawinąć ConcurrentDictionary w BlockingCollection?
- 7. kilka pytań dotyczących używania ConcurrentDictionary
- 8. IDictionary <,> Kontrawariancja?
- 9. Przesyłanie z void * do struct
- 10. Przesyłanie do AmazonS3 z SonataMediaBundle
- 11. Dlaczego HttpSessionState nie implementuje IDictionary?
- 12. Przenośna biblioteka klas i .NET ConcurrentDictionary
- 13. Alternatywa dla ConcurrentDictionary dla przenośnej biblioteki klas
- 14. Kiedy należy używać ConcurrentDictionary i Dictionary?
- 15. Przesyłanie AnyObjecta do słownika
- 16. Przesyłanie CFDictionaryRef do NSDictionary?
- 17. Przesyłanie plików do ftp z aplikacji iOS
- 18. Przesyłanie do Dropbox z Dysku Google
- 19. Przesyłanie zmiennej do SASS z Gruntem
- 20. Przesyłanie filmu do youtube z przeglądarki
- 21. Przesyłanie do S3 z Laravel Quality Lost
- 22. Płynny kod do mapowania IDictionary <SomeEntity, int>?
- 23. Deserializuj rekursywnie JSON do IDictionary <ciąg, obiekt>
- 24. Przesyłanie strumieniowe z iCloud?
- 25. Przesyłanie plików z Tornado
- 26. Uzyskiwanie wartości ogólnego IDictionary za pomocą refleksji
- 27. Duży obiekt przyjazny dla stosu IDictionary
- 28. Przesyłanie z Paperclip 404ing
- 29. Przesyłanie z wieloma Androidami
- 30. Przesyłanie plików z okhttp
Jak masz na myśli "cięcie"? Czy usuwa go z 'ConcurrentDictionary'? Nie. Czy jest dostępny z interfejsu 'IDictionary'? –
@ James MichaelHare: On oznacza, że jeśli rzucisz na 'IDictionary', czy spowoduje to, że wynikowy obiekt stanie się niebezpieczny? Innymi słowy, czy przekształca go w zwykły słownik? –
Czy nadal będzie bezpieczny dla wątków? Tak, jak to możliwe bez tych operacji. Oznacza to, że jeśli potrzebujesz atomowego 'GetOrAdd()' będziesz miał pecha. –