Pregunta

Yo estaba usando un BackgroundWorker descargar algunos sitios web llamando WebClient.DownloadString dentro de un bucle. Yo quería que la opción para que el usuario cancela en el medio de la descarga de material, así que llamé CancelAsync cada vez que me encontré con que estaba en CancellationPending en medio del bucle.

Pero ahora se dio cuenta de que la función de DownloadString poco congela a veces, así que decidí usar DownloadStringAsync lugar (todo esto dentro del otro hilo creado con BackgroundWorker). Y puesto que no quiero volver a escribir toda mi código por tener que salir del bucle y la función después de llamar DownloadStringAsync, hice un derecho bucle while después de llamar a lo que no hace más que un cheque por bool Stop variable que enciendo cierto ya sea cuando el DownloadStringCompleted controlador de eventos se llama o cuando la solicitud del usuario para cancelar la operación.

Ahora, lo raro es que funciona muy bien en la versión de depuración; pero sobre la liberación uno, el programa se congela en el bucle while como si fuera el hilo principal.

¿Fue útil?

Solución

Me suena a que están ocupados en espera con un bucle while. Debe utilizar eventos de señalización en lugar, por ejemplo. un WaitHandle. Un bucle de espera ocupada en modo de lanzamiento muy bien podría consumir todo su CPU, dando una sensación de una congelación.

Señal del WaitHandle en DownloadStringCompleted o si el usuario cancela la descarga.

MSDN docs en el WaitHandle clase. Hay también un ejemplo allí.

Otros consejos

Envíe su bucle while que es la comprobación de la cancelación a dormir por un tiempo corto (algunos ms). Esto bien liberar el tiempo de ejecución de la CPU para otros hilos y procesos.

buen tema, he usado En mi proceso de trabajo de un doble fondo, mientras

 int icounter = 1;
 while (icounter < SomeListInventory.Count)
            {
                while (pauseWorker == false)
                { 
                    //-----------------------
                    //DO SOME WORK
                        icounter++;
                    //-----------------------
                }
            }

Y tengo un botón de pausa, que cuando lo presiona, (variable global o propiedad) pauseWorker se convierte en verdadera y bucles en sólo el primer tiempo, sin aumentar el icounter, y cuando hago el pauseworker = false nuevo el proceso continúa

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