2012-04-11 14 views
6

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

+0

Jak masz na myśli "cięcie"? Czy usuwa go z 'ConcurrentDictionary'? Nie. Czy jest dostępny z interfejsu 'IDictionary'? –

+2

@ 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? –

+0

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. –

Odpowiedz

10

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.

+0

Możesz również zajrzeć do dokumentacji MSDN dla implementacji ConcurrentDictionary z 'IDictionary ' metody: http://msdn.microsoft.com/en-us/library/dd287191.aspx – phoog

6

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).

1

Interfejs nie ma wpływu na implementację. To po prostu nie ujawnia niektórych metod z ConcurrentDictionary.

Możesz znaleźć this lub this pomocne w rozumieniu interfejsów.

0

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.

-1

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.

+0

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

Powiązane problemy