La documentación de ConcurrentDictionary
estado no hace explícita, así que supongo que no podemos esperar que los delegados valueFactory
y updateValueFactory
tienen su ejecución sincronizada (de GetOrAdd() y AddOrUpdate() las operaciones, respectivamente).ConcurrentDictionary Pitfall - ¿Están delegadas las fábricas de GetOrAdd y AddOrUpdate sincronizadas?
Por lo tanto, creo que no podemos implementar el uso de recursos dentro de ellos que necesitan control concurrente sin implementar manualmente nuestro propio control simultáneo, tal vez simplemente usando [MethodImpl(MethodImplOptions.Synchronized)]
sobre los delegados.
¿Estoy en lo cierto? O el hecho de que ConcurrentDictionary
es seguro para subprocesos, podemos esperar que las llamadas a estos delegados se sincronicen automáticamente (también a prueba de subprocesos)?
Así que estoy envolviendo la llamada al método GetOrAdd en un bloqueo, pero eso hace que el propósito del ConcurrentDictionary sea inútil. ¿Hay una mejor manera? – John
Estoy un poco confundido por esto, ¿básicamente estamos diciendo que si se pasa un delegado como clave, su ejecución no se sincronizará al evaluar el * valor *? O si tenemos un diccionario con el tipo "delegar" como el valor ... que cuando intentamos ejecutar el delegado (es decir, 'diccionario [clave] (argumento);') que la ejecución no se sincronizará? O, ¿me estoy perdiendo el punto por completo? Gracias. – Snoopy
@Snoopy: el delegado que evalúa el valor para agregar no está sincronizado. Esto significa que si su delegado hace algo que no es seguro para subprocesos * y * no intentó sincronizar esa operación usted mismo, entonces sucederán cosas malas. Pero, lo que un delegado que actúa como fábrica de un valor normalmente no estaría haciendo cosas que no son seguras para subprocesos por naturaleza. La mayoría de las veces, el delegado probablemente solo está haciendo 'nuevo SomeObject()', que definitivamente es seguro para subprocesos porque es una operación sin estado. –