for (do it a bunch of times)
{
while (backgroundWorker1.IsBusy && backgroundWorker2.IsBusy &&
backgroundWorker3.IsBusy && backgroundWorker4.IsBusy &&
backgroundWorker5.IsBusy)
{
System.Threading.Thread.Sleep(0001);
}
if (!backgroundWorker1.IsBusy)
{
backgroundWorker1.RunWorkerAsync();
}
else if (!backgroundWorker2.IsBusy)
{
backgroundWorker2.RunWorkerAsync();
}
else if (!backgroundWorker3.IsBusy)
{
backgroundWorker3.RunWorkerAsync();
}
else if (!backgroundWorker4.IsBusy)
{
backgroundWorker4.RunWorkerAsync();
}
else if (!backgroundWorker5.IsBusy)
{
backgroundWorker5.RunWorkerAsync();
}
}
funciona cinco veces (cada trabajador de BG una vez) y se atasca en el tiempo. ¿Los trabajadores de fondo nunca dejan de estar ocupados? ¿Cómo verifico la disponibilidad?BackgroundWorkers nunca deja de estar ocupado
nota: hay 5 subprocesos de trabajo, esto asegura que ninguno de ellos se detiene, siempre asignándoles trabajo. Pero se niegan a dime cuando están disponibles, pensé que tendría una solución sencilla ..
- [Solicitud editar] ---
En realidad era sólo un parámetro ficticio, lo quité y se olvidó de sacarlo, sólo lo uso para llamar a la DoWork, que hace el trabajo sucio:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
timeconsumingfunction(publicstring);
}
Y el timeconsumingfunction termina. entrando en el depurador y ejecutando la línea por línea, va hasta el final y llega al final '}'. Eso significa que termina, ¿verdad?
--- [RESPUESTA EDIT] ---- funcionó mediante la sustitución de sólo la línea de
System.Threading.Thread.Sleep(0001);
con
Application.DoEvents();
creo que va a funcionar el fondo, pero no recibe el responder y no actualizar las etiquetas IsBusy.
Gracias a todos, excelentes respuestas, ¡ayudaron mucho!
La manera más fácil de determinar si el trabajo está terminado es colocar un punto de interrupción en el evento RunWorkerCompleted y dejar que el programa se ejecute. Si llega al punto de interrupción, el trabajador de segundo plano ha terminado el trabajo. – 53an