2009-12-17 11 views
21

En un sitio web ASP .NET ocupado, tengo un diccionario, que actúa como un caché, básicamente almacenando pares clave/valor para su posterior recuperación.¿Cuándo arroja un diccionario IndexOutOfRangeException en Add o ContainsKey?

En alta carga, el diccionario algunas veces entra en un estado, donde siempre arroja una excepción IndexOutOfRangeException cada vez que llamo al método ContainsKey o Add. La excepción ocurre dentro del método privado FindEntry.

Sospecho que esto podría deberse a un problema de sincronización, pero no estoy seguro.

¿Alguien puede decirme en qué circunstancias puede suceder esto? Mi objetivo es recopilar suficiente información para poder reproducir el problema en el entorno de desarrollo.

+0

¿Anuló el método *** Equals ***, que también se utilizó internamente para comparar objetos? – serhio

Respuesta

20

La documentación para Dictionary estados:

los miembros de instancias no están garantizados para la ejecución de subprocesos.

Para permitir que la colección sea accedida por varios hilos para lectura y escritura, debe implementar su propia sincronización.

Si no está sincronizando el acceso a la Dictionary, entonces es posible obtener cuestiones como las que describes (presumiblemente debido a que el estado interno ya no es válido). Si quiere probar y reproducir esto en su entorno de desarrollo, intente crear un programa que use múltiples hilos para leer y escribir continuamente desde un Dictionary sin sincronización.

1

Estoy de acuerdo en que esto es casi seguro un problema de sincronización.

No conozco ninguna documentación que describa exactamente cuándo y cómo puede ocurrir esto; el comportamiento no está definido si utiliza un diccionario de una manera que no sea segura contra la formación de hilos.

Para probar en su entorno de desarrollo, sugiero ejecutar algunos hilos paralelos que inserten, eliminen, actualicen, etc. al azar en un bucle continuo (básicamente una versión "concentrada" de lo que sucede en su entorno de producción).

Cuestiones relacionadas