Colecciones concurrentes en C #

Estoy buscando una forma de obtener una colección concurrente en C # o al menos una colección que admita un enumerador concurrente. Ahora mismo estoy recibiendo una InvalidOperationException cuando la colección sobre la cual estoy iterando cambia. Podría copiar la colección en profundidad y trabajar con una copia privada, pero me pregunto si hay tal vez una mejor manera.

Fragmento de código:

foreach (String s in (List )callingForm.Invoke(callingForm.delegateGetKillStrings)) { //do some jazz } 

–editar–

Tomé la respuesta pero también encontré que necesitaba asegurarme de que el código que estaba escribiendo en la colección también debía intentar obtener un locking.

  private void addKillString(String s) { lock (killStrings) { killStrings.Add(s); } } 

Además de hacer una copia en profundidad, su mejor apuesta podría ser bloquear la colección:

  List theList = (List )callingForm.Invoke(callingForm.delegateGetKillStrings); lock(theList.SyncRoot) { foreach(string s in theList) { // Do some Jazz } } 

Así que no estoy muy seguro de lo que está preguntando, pero el equipo de Extensiones Paralelas ha reunido algunas cosas que podrían ajustarse a la ley. Vea esta publicación de blog en particular, sobre la enumeración de colecciones paralelas . También contiene un enlace para descargar el CTP paralelo y, por supuesto, puede navegar por el rest de las publicaciones del blog para tener una idea de lo que debe hacer el CTP y cómo funciona el modelo de progtwigción.

Si desea utilizar las colecciones FCL, entonces el locking es la única forma de admitir la iteración / modificación de varios subprocesos que pueden superponerse.

Sin embargo, tenga cuidado con lo que usa como su objeto de locking. Usar SyncRoot es solo una buena idea si la colección en sí es un miembro privado de la clase que lo usa. Si la colección está protegida o es pública, entonces un cliente de su clase puede usar su propio locking en su SyncRoot, potencialmente bloqueando el código de su clase.

Si está interesado en echar un vistazo a una biblioteca de colecciones de terceros, le recomiendo la excelente Biblioteca de colecciones genéricas C5 . Tienen una familia de colecciones basadas en árboles que pueden modificarse y repetirse de forma fácil y segura al mismo tiempo sin locking. Consulte las secciones 8.10 y 9.11 de su (excelente) documentación para obtener más detalles.