Come faccio a mettere in pausa un BackgroundWorker? O qualcosa di simile
-
26-09-2019 - |
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.
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