Bien, entonces me encuentro con un pequeño y extraño problema y, francamente, me he quedado sin ideas. Quería arrojar esto para ver si me estoy perdiendo algo que he hecho mal, o si ConcurrentDictionary no está funcionando correctamente. Aquí está el código:ConcurrentDictionary: ¿diccionario roto o código incorrecto?
(caché es una clase que contiene las claves ConcurrentDictionary estáticas)
El problema es que de vez en cuando tmp
es null
, haciendo que la línea de TryRemove
para funcionar, sin embargo, la línea de return null;
anterior no se ve afectado . Dado que return null
es lo único que pone null
en el diccionario y nunca se ejecuta, ¿cómo podría tmp
ser alguna vez null
?
Incluyendo la clase Cache (SetNames no es utilizado por el código):
public class Cache
{
public static ConcurrentDictionary<Type, Info> Keys = new ConcurrentDictionary<Type, Info>();
public static ConcurrentDictionary<Type, string> SetNames = new ConcurrentDictionary<Type, string>();
}
¿Tal vez ya existe un valor 'nulo' en el diccionario? –
¿Cuántos subprocesos ejecutan este código? No parece ser seguro para subprocesos. – oleksii
@IlyaKogan - No, el diccionario está vacío cuando se inicia y nunca contiene un valor nulo, incluso cuando se golpea el punto de corte dentro de 'if (tmp == null)'. –