Saludos.Implementación de subprocesamiento múltiple en C# (revisión de código)
Estoy tratando de implementar algún código multiproceso en una aplicación. El propósito de este código es validar elementos que la base de datos le da. La validación puede llevar bastante tiempo (unos pocos cientos de ms a unos pocos segundos), por lo que este proceso debe dividirse en su propio hilo para cada elemento.
La base de datos puede darle 20 o 30 elementos por segundo al principio, pero eso comienza a disminuir rápidamente, alcanzando finalmente alrededor de 65K elementos durante 24 horas, en cuyo punto se cierra la aplicación.
Me gustaría que cualquier persona más conocedora pudiera echar un vistazo a mi código y ver si hay algún problema obvio. Nadie con quien trabajo sabe multihilo, así que estoy realmente solo, en este.
Aquí está el código. Es un poco largo, pero debería ser bastante claro. Avíseme si tiene algún comentario o consejo. ¡Gracias!
public class ItemValidationService
{
/// <summary>
/// The object to lock on in this class, for multithreading purposes.
/// </summary>
private static object locker = new object();
/// <summary>Items that have been validated.</summary>
private HashSet<int> validatedItems;
/// <summary>Items that are currently being validated.</summary>
private HashSet<int> validatingItems;
/// <summary>Remove an item from the index if its links are bad.</summary>
/// <param name="id">The ID of the item.</param>
public void ValidateItem(int id)
{
lock (locker)
{
if
(
!this.validatedItems.Contains(id) &&
!this.validatingItems.Contains(id)
){
ThreadPool.QueueUserWorkItem(sender =>
{
this.Validate(id);
});
}
}
} // method
private void Validate(int itemId)
{
lock (locker)
{
this.validatingItems.Add(itemId);
}
// *********************************************
// Time-consuming routine to validate an item...
// *********************************************
lock (locker)
{
this.validatingItems.Remove(itemId);
this.validatedItems.Add(itemId);
}
} // method
} // class
@Chris: ¿Por qué está 'Locker' estático si las variables miembro que están siendo protegidas por 'Locker' no lo son? 'Locker' debe ser una variable miembro en lugar de una variable de clase. – user7116