Pregunta

Estoy creando una matriz de BackgroundWorker que comparte un controlador de eventos como este:

BackgroundWorker[] workers = new BackgroundWorker[files.length];

for(int i = o; i<files.length; i++)
{
      workers[i] = new BackgroundWorker();
      workers[i].DoWork += new DoWorkEventHandler(worker_DoWork);
      workers[i].RunWorkerCompleted += newRunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
      workers[i].RunWorkerAsync(files[i]);
}

Todos los trabajadores comparten el mismo controlador de eventos que hace lo mismo solo con diferentes argumentos y resultados como este:

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
         e.Result = ComputeSomething(e.Argument.ToString());
}

private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
            resultArray.Add(e.Result);
}

private int ComputeSomething(string file)
{
         ...
         return number;
}

obviamente en el código, estoy tratando de hacer una lista de BackgroundWorker que se ejecute de forma asíncrona, pero cuando verifiqué los resultados, algunos de ellos son incorrectos. Supongo que el valor de "e.result" fueron reemplazados por otros trabajadores ya que comparten el mismo controlador de eventos si ese es el caso, entonces me gustaría crear controladores de eventos individuales para cada BackgroundWorker para que el valor de e.result no sea reemplazado. ¿Cómo voy a hacer eso?

¿Fue útil?

Solución

Intente sincronizar el acceso a resultArray:


private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    lock(resultArray)
        resultArray.Add(e.Result);
}

Otros consejos

Compartir el mismo método de controlador de eventos no debería ser un problema: es el BackgroundWorker que proporciona la " e " en el que almacena el resultado.

Por otro lado, usted está accediendo a resultArray desde múltiples hilos. Eso podría estar causando un problema. ¿Qué tipo de errores estás viendo en los resultados? Aparte de la forma en que combina los resultados al final, esperaría que todo esté bien.

No veo cómo e.Result podría ser reemplazado por otros trabajadores. Cuando dice que algunos resultados son incorrectos, ¿quiere decir que el valor es incorrecto, que no hay ningún valor o que algunos resultados se duplican mientras que otros desaparecen? Me parece que debería poner un sincronizador al agregar a resultsArray para asegurarse de que sea seguro para subprocesos.

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