usa tipos switch quedar puede palabras modificador lenguaje instruccion fuera etiqueta entonces control como comandos codigos claves caso c# concurrent-programming

c# - tipos - palabras claves del lenguaje c



¿Es esta la manera correcta de iterar sobre Concurrentdictionary en C# (2)

Solo estoy usando este código para un ejemplo. Supongamos que tengo la siguiente clase de persona.

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace dictionaryDisplay { class Person { public string FirstName { get; private set;} public string LastName { get; private set; } public Person(string firstName, string lastName) { this.FirstName = firstName; this.LastName = lastName; } public override string ToString() { return this.FirstName + " " + this.LastName; } }

}

Programa principal

static void Main(string[] args) { ConcurrentDictionary<int, Person> personColl = new ConcurrentDictionary<int, Person>(); personColl.TryAdd(0, new Person("Dave","Howells")); personColl.TryAdd(1, new Person("Jastinder","Toor")); Person outPerson = null; personColl.TryRemove(0, out outPerson); //Is this safe to do? foreach (var display in personColl) { Console.WriteLine(display.Value); } }

  1. ¿Es esta la forma segura de iterar sobre un diccionario concurrente? Si no, ¿cuál es la forma segura de hacerlo?

  2. Digamos que quiero eliminar un objeto Person del diccionario. Uso el método tryRemove, pero ¿qué hago con el objeto outPerson? la persona eliminada del diccionario está almacenada en ella. ¿Qué hago con el objeto outPerson para borrarlo por completo?


¿Es esta la forma segura de iterar sobre un diccionario concurrente? Si no, ¿cuál es la forma segura de hacerlo?

Sí, es seguro ya que no arrojará una excepción. Si los elementos se agregan o eliminan después de que comiences a iterar, pueden o no incluirse en la iteración. De la documentación de GetEnumerator :

El enumerador devuelto por el diccionario es seguro de usar al mismo tiempo que las lecturas y escrituras en el diccionario, sin embargo, no representa una instantánea de momento en el tiempo del diccionario. Los contenidos expuestos a través del enumerador pueden contener modificaciones realizadas en el diccionario después de llamar a GetEnumerator.

Siguiente:

Uso el método tryRemove, pero ¿qué hago con el objeto outPerson?

Lo que quieras con eso, sin incluir nada. Podrías simplemente lanzar el diccionario a IDictionary<TKey, TValue> y llamar a Remove , o simplemente usar TryRemove e ignorar la variable después:

Person ignored; dictionary.TryRemove(key, out ignored);

No existe el concepto de "borrar [el objeto] por completo": si no tiene ninguna referencia, será basura. Pero de cualquier manera, ya no está en el diccionario (al menos a través de esa clave). Si no usa la variable ( ignored anteriormente) en ningún otro lugar del código, no impedirá que el objeto sea recolectado como basura.


Eche un vistazo a este artículo.

TryRemove() was added to attempt atomic, safe removes. To safely attempt to remove a value we need to see if the key exists first, this checks for existence and removes under an atomic lock.

Como TryRemove eliminará el elemento de la colección, es posible que necesite el valor de la clave.

Es seguro iterarlo con foreach. No obtendrás una excepción.