Pregunta

Tengo dos hilos, uno necesita sondear un montón de recursos estáticos separados en busca de actualizaciones.El otro necesita obtener los datos y almacenarlos en la base de datos.¿Cómo puede el hilo 1 decirle al hilo 2 que hay algo que procesar?

¿Fue útil?

Solución

Si los datos son independientes, trátelos como elementos de trabajo que serán procesados ​​por un grupo de subprocesos.Utilice el grupo de subprocesos y QueueUserWorkItem para publicar los datos en los hilos.Debería obtener una mejor escalabilidad utilizando un conjunto de subprocesos simétricos y limitando la cantidad de sincronización que debe ocurrir entre el productor y los consumidores.

Por ejemplo (de MSDN):

    TaskInfo ti = new TaskInfo("This report displays the number {0}.", 42);

    // Queue the task and data.
    if (ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc), ti)) {    
        Console.WriteLine("Main thread does some work, then sleeps.");

        // If you comment out the Sleep, the main thread exits before
        // the ThreadPool task has a chance to run.  ThreadPool uses 
        // background threads, which do not keep the application 
        // running.  (This is a simple example of a race condition.)
        Thread.Sleep(1000);

        Console.WriteLine("Main thread exits.");
    }
    else {
        Console.WriteLine("Unable to queue ThreadPool request."); 
    }


// The thread procedure performs the independent task, in this case
// formatting and printing a very simple report.
//
static void ThreadProc(Object stateInfo) {
    TaskInfo ti = (TaskInfo) stateInfo;
    Console.WriteLine(ti.Boilerplate, ti.Value); 
}

Otros consejos

Utilizo Monitor.Wait/Pulse en una cola de elementos de trabajo.

¿Es necesario que el hilo "almacenar en la base de datos" esté siempre ejecutándose?Parece que quizás la mejor opción (si es posible) sería hacer que el hilo de votación genere otro hilo para guardar.Sin embargo, dependiendo de la cantidad de subprocesos que se creen, podría ser que hacer que el primer subproceso de sondeo use ThreadPool.QueueUserWorkItem() sea la ruta más eficiente.

Para mayor eficiencia, al guardar en la base de datos, usaría E/S asíncrona en la base de datos en lugar de los métodos de sincronización.

Siempre que pueda evitar tener que comunicarse directamente entre dos hilos, debería hacerlo.Al tener que reunir algunas primitivas de sincronización, su código no será tan fácil de depurar y podría introducir algunas condiciones de carrera muy sutiles que causan errores del tipo "una vez en un millón de ejecución" (que están lejos de ser divertidos de encontrar/arreglar).

Si el segundo hilo siempre debe estar ejecutándose, díganos por qué con más información y podremos regresar con una respuesta más detallada.

¡Buena suerte!

Personalmente, el hilo 1 generaría eventos a los que el hilo 2 puede responder.Los subprocesos pueden conectarse a los eventos apropiados mediante el proceso de control que inicia ambos subprocesos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top