Tengo un bucle Parallel.ForEach ejecutando una operación intensiva dentro del cuerpo.¿Usando una tabla hash dentro de un Parallel.ForEach?
La operación puede usar una tabla Hash para almacenar los valores, y puede reutilizarse para otros elementos de bucle consecutivos. Agrego a Hashtable después de completar la operación intensiva, el siguiente elemento de bucle puede buscar en el Hashtable y reutilizar el objeto, en lugar de ejecutar nuevamente la operación intensiva.
Sin embargo, como estoy usando Parallel.ForEach, existe un problema inseguro, que hace que las llamadas Hashtable.Add y ContainsKey (clave) no estén sincronizadas, ya que podrían estar ejecutándose en paralelo. La introducción de bloqueos puede causar problemas de rendimiento.
Aquí está el código de ejemplo:
Hashtable myTable = new Hashtable;
Parallel.ForEach(items, (item, loopState) =>
{
// If exists in myTable use it, else add to hashtable
if(myTable.ContainsKey(item.Key))
{
myObj = myTable[item.Key];
}
else
{
myObj = SomeIntensiveOperation();
myTable.Add(item.Key, myObj); // Issue is here : breaks with exc during runtime
}
// Do something with myObj
// some code here
}
Debe haber alguna API, el establecimiento de la propiedad dentro de la biblioteca TPL, que pudiera manejar esta situación. ¿Esta ahí?
@AdamRalph: desde que está utilizando la biblioteca TPL él ya está usando .net 4.0 –
@ Adam & Yassir: correctas, las nuevas colecciones fueron diseñadas con Parallel LINQ en mente. –
Yup Gracias por las respuestas y comentarios – Vin