¿Cómo bloqueo la clase de devolución de llamada en un rastreador multiproceso asíncrono?
Frecuentes
Visto 711 equipos
1
Escribí un rastreador que usa una lista de palabras cargada por el usuario para realizar múltiples búsquedas en un sitio y analizar cada página resultante.
Para lograr esto, escribí un método principal que recorre la lista de palabras, enviando múltiples solicitudes http get de forma asíncrona (usando ThreadPool.QueueUserWorkItem) para obtener todas las páginas de resultados de la palabra actual hasta que no se encuentran más resultados, y luego continúa. a la siguiente palabra.
La función de devolución de llamada accede a una clase estática pública con un método estático que analiza el html devuelto y actúa en consecuencia. En este momento, lo tengo bloqueado en el tipo de clase cada vez que algo accede al método:
static class Parser
{
public static string ResponseAsString(HttpWebResponse response)
{
lock (typeof(Parser))
{
try
{
Stream stream;
if (response == null || (stream = response.GetResponseStream()) == null) return string.Empty;
using (var sr = new StreamReader(stream))
return sr.ReadToEnd();
}
catch { return string.Empty; }
}
}
public static void CallbackMethod_ParseData(string html)
{
lock (typeof(Parser))
{
//Do some work here
}
}
}
Entonces, mi pregunta: ¿cómo puedo bloquear la clase de manera más eficiente y notificar a los subprocesos en espera cuando se libera el bloqueo, o no debería hacer que Parser sea una clase estática y, en cambio, dejar que cada subproceso ThreadPool cree su propia instancia de esta clase?
Muchas gracias por su ayuda,
-aún aprendiendo
2 Respuestas
1
Las cerraduras no son necesarias. Los métodos estáticos son seguros para subprocesos siempre que no compartan datos estáticos, que según su ejemplo, no lo son.
contestado el 22 de mayo de 12 a las 17:05
1
Mirando su código, no creo que haya ninguna razón para tener el bloqueo.
contestado el 22 de mayo de 12 a las 17:05
¿Qué tal si hago una llamada en CallbackMethod_ParseData a otra clase estática (Globals) que contiene un objeto List? Este método se llama "Globals.AddToList" y usa lock (ListObj). ¿Cómo puedo hacer eso más eficiente, en todo caso? - blizz
No creo que puedas. Parece que, en ese caso, en realidad está accediendo a un recurso compartido, por lo que es necesario un bloqueo en ese caso. No me preocuparía tanto por la eficiencia como por el manejo adecuado de los hilos. - spencer ruport
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c# .net http asynchronous or haz tu propia pregunta.
Lo siento, soy nuevo aquí... y no puedo votar a favor de nadie porque no tengo suficientes representantes. blizz
Bueno, me siento como un idiota ahora jaja. Lo siento, olvidé que hay un requisito mínimo de puntos para votar. :( - Spencer Ruport