Domanda

Io sto usando un BackgroundWorker per scaricare alcuni siti web chiamando WebClient.DownloadString all'interno di un ciclo. Volevo la possibilità per l'utente di annullare a metà del download di roba, così ho chiamato CancelAsync ogni volta ho trovato che CancellationPending era nel bel mezzo del ciclo.

Ma ora ho notato che la funzione DownloadString congela po 'a volte, così ho deciso di utilizzare invece DownloadStringAsync (tutto questo dentro l'altro thread creato con BackgroundWorker). E siccome io non voglio riscrivere tutto il mio codice per la necessità di uscire dal ciclo e la funzione dopo aver chiamato DownloadStringAsync, ho fatto un ciclo while subito dopo definendolo che non fa altro che controllo per un bool Stop variabile che mi rivolgo vero sia quando il gestore di eventi DownloadStringCompleted viene chiamato o quando la richiesta dell'utente per annullare l'operazione.

Ora, la cosa strana è che funziona bene sulla versione di debug; ma da un rilascio, il programma si blocca nel ciclo while come se fosse il filo principale.

È stato utile?

Soluzione

Sembra a me che si sono impegnati, in attesa di un ciclo while. Si consiglia di utilizzare eventi di segnalazione, invece, ad es. un WaitHandle. Un ciclo busy-attesa in modalità di rilascio potrebbe benissimo consumare tutto CPU, dando una sensazione di un congelamento.

Segnale il WaitHandle in DownloadStringCompleted o se l'utente annulla il download.

MSDN docs sul WaitHandle classe. C'è anche un esempio qui.

Altri suggerimenti

Invia la tua ciclo while che sta controllando per la cancellazione a dormire per un breve periodo (alcuni ms). Questo ben liberare il runtime CPU per altri thread e processi.

topic bello, ho usato Nel mio processo in background lavoratore una doppia, mentre

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

E ho una pausa pulsante, che quando i premere esso, (variabile globale o struttura) pauseWorker diventa vero e passanti nel solo primo tempo, senza aumentare l'iCounter, e quando faccio l'pauseworker = false nuovamente il processo continua

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top