2012-04-11 23 views
6

¿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

+0

¿Cómo se refiere a "cortar", precisamente? ¿Lo elimina de 'ConcurrentDictionary'? No. ¿Está disponible desde la interfaz 'IDictionary'? No. –

+2

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

+0

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

Respuesta

10

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.

+0

También puede consultar la documentación de MSDN para las implementaciones de ConcurrentDictionary de los métodos 'IDictionary ': http://msdn.microsoft.com/en-us/library/dd287191.aspx – phoog

6

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

1

La interfaz no afecta la implementación. Simplemente no expuso algunos de los métodos de ConcurrentDictionary.

Puede encontrar que this o this son útiles para comprender las interfaces.

0

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.

-1

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.

+0

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

Cuestiones relacionadas