¿Por qué necesitamos el tercer argumento comparisonValue en el método ConcurrentDictionary.TryUpdate ?
¿Y por qué la actualización no tendrá éxito si el valor ya existente no es igual al valor de comparisonValue ? ¿No podemos simplemente reemplazar el valor existente con el nuevo como en el Dictionary<,> ?
Esta es la firma:
public bool TryUpdate(TKey key, TValue newValue, TValue comparisonValue)El punto es que está usando un diccionario simultáneo para escenarios con acceso simultáneo al diccionario. No sabes quién (y cómo) cambió el diccionario mientras tanto. Pasar un valor de comparación es una forma muy simple y efectiva de hacer el cambio solo si el estado del diccionario es el mismo que esperas.
Si espera que las colisiones sean relativamente raras, esta es una forma muy eficiente y eficaz de manejar el estado compartido (no es necesario bloquear y, por lo tanto, detener todo acceso). Este patrón es la base del código sin bloqueo; lo ves incluso en el nivel de hardware. Puede buscar Comparar e intercambiar (o Comparar e intercambiar) para obtener más información.
Si desea actualizar una clave de un ConcurrentDictionary independientemente de su valor actual, puede usar el descriptor de acceso establecido del indexador :
var dictionary = new ConcurrentDictionary<int, string>(); dictionary[1] = "Hello"; dictionary[2] = "World"; dictionary[1] = "Goodbye"; Console.WriteLine(String.Join(", ", dictionary));Producción:
[1, Goodbye], [2, World] Si cada subproceso funciona con un conjunto aislado de claves, actualizar un ConcurrentDictionary como este podría ser suficiente. Pero si varios subprocesos compiten por actualizar las mismas claves, podría surgir el caos. En esos casos, puede ser conveniente utilizar el método TryUpdate o, con mayor frecuencia, el método AddOrUpdate . Estos métodos permiten actualizar condicionalmente el diccionario, siendo la comprobación y actualización una operación atómica.
La siguiente pregunta podría ofrecer algunas ideas sobre cómo se puede usar esta API en la práctica:
¿Hay alguna forma de usar ConcurrentDictionary.TryUpdate con una expresión lambda?