¿Se interrumpe el lanzamiento de ConcurrentDictionary a IDictionary por la implementación de seguridad de subprocesos, ya que IDictionary no tiene los métodos GetOrAdd y AddOrUpdate?Transmitir de ConcurrentDictionary a IDictionary
Respuesta
El objeto resultante seguirá siendo un diccionario simultáneo. Las llamadas como Agregar o Eliminar usan la implementación subyacente TryAdd y TryRemove (que son seguras para subprocesos). Convertir un objeto en un tipo diferente no cambia el objeto en sí.
Además, como aclaración, puede utilizar herramientas como ILSpy para ver cuál es la implementación de los métodos IDictionary predeterminados y si todavía estarán seguros para subprocesos.
También puede consultar la documentación de MSDN para las implementaciones de ConcurrentDictionary de los métodos 'IDictionary
IDictionary
es solo una interfaz. Si lo lanzas, el resultado es una implementación de ConcurrentDictionary, faltando los métodos GetOrAdd
y AddOrUpdate
.
Presumiblemente, aún puede utilizar la propiedad Item
y los métodos Add
y ContainsKey
(en lugar de los GetOrAdd
y AddOrUpdate
) métodos, y su objeto fundido todavía será seguro para subprocesos (ya que la implementación subyacente es un ConcurrentDictionary
).
Sería como mirar a grandes ConcurrentDictionary
objeto a través del ojo de la cerradura en forma de IDictionary
- sólo se podía ver IDictionary
forma, pero aún así sería ConcurrentDictionary
.
Respuesta corta no.
Está manipulando un objeto a través de una interfaz y, por lo tanto, sigue utilizando la implementación concreta. No estás perdiendo ninguna funcionalidad ni sus métodos. Simplemente no están disponibles.
Como nota al margen, necesita un lanzamiento explícito cuando se realiza una transmisión descendente, sin necesidad de un lanzamiento explícito cuando se realiza la difusión ascendente; siempre es seguro hacerlo.
lo siento pero ConcurrentDictionary agrega dos nuevos métodos y oculte otros, por lo que su implementación podría agregar thread-safe solo para los nuevos métodos, y no para los métodos ocultos. La documentación de MSDN no lo aclara, así que lo pregunté.Pero después de leer los mejores comentarios y eché un vistazo al prototipo de ConcurrentDictionary, vi lo que no se extiende Diccionario, y esto me aseguró que es improbable que el lanzamiento a IDictionary indirectamente utilizaría la versión extendida del Diccionario. – Luciano
- 1. IDictionary a SelectList?
- 2. A diferencia de estilo: IDictionary vs Diccionario
- 3. ¿Transmitir a LPCWSTR?
- 4. La mejor manera de traducir de IDictionary a un IDictionary genérico
- 5. .NET - Diccionario vs ConcurrentDictionary
- 6. Enumeración y bloqueo de ConcurrentDictionary
- 7. IDictionary <,> contravariancia?
- 8. ILookup interface vs IDictionary
- 9. Convertir IDictionary en Diccionario
- 10. Ordenar una ConcurrentDictionary por valor
- 11. Cuándo ConcurrentDictionary TryRemove devolverá falso
- 12. Cómo envolver ConcurrentDictionary en BlockingCollection?
- 13. ¿Cómo transmitir videos a través de HTML5?
- 14. Transmitir una aplicación de PowerBuilder a .NET
- 15. ¿Transmitir getUserMedia a un servidor de Icecast?
- 16. Método de eliminación concurrentemente concurrente de ConcurrentDictionary
- 17. Large Object Heap friendly IDictionary
- 18. Biblioteca de clases portátil y .NET ConcurrentDictionary
- 19. algunas preguntas sobre el uso de ConcurrentDictionary
- 20. A .Net4 Gem: The ConcurrentDictionary - Consejos y trucos
- 21. ¿Cómo se accede a ConcurrentDictionary y cómo serializarlo?
- 22. ¿Cómo inicializar IDictionary en constructor?
- 23. Transmitir una biblioteca muy Pythonesque a .NET
- 24. Transmitir archivo grande a servicio web
- 25. Transmitir flotante a int en OCaml
- 26. ¿Transmitir a una interfaz no implementada explícitamente?
- 27. Transmitir a tipo genérico en C#
- 28. Transmitir T a bool y viceversa
- 29. Deserializar JSON recursivamente a IDictionary <cadena, objeto>
- 30. ¿Cómo transmitir malas noticias a los clientes?
¿Cómo se refiere a "cortar", precisamente? ¿Lo elimina de 'ConcurrentDictionary'? No. ¿Está disponible desde la interfaz 'IDictionary'? No. –
@JamesMichaelHare: Quiere decir que, si lo lanzas a 'IDictionary', ¿hace que el objeto resultante sea inseguro? En otras palabras, ¿lo convierte en un diccionario ordinario? –
¿Seguirá siendo seguro para subprocesos? Sí, en la medida en que puede ser sin esas operaciones. Es decir, si necesita un 'GetOrAdd()' atómico no tendrá suerte. –