Question

Je travaillais avec un BackgroundWorker de télécharger des sites Web en appelant WebClient.DownloadString dans une boucle. Je voulais l'option pour l'utilisateur d'annuler au milieu de télécharger des choses, alors j'ai appelé CancelAsync chaque fois que je trouvais que CancellationPending était au milieu de la boucle.

Mais maintenant, je remarque que la fonction DownloadString fige un peu parfois, alors j'ai décidé d'utiliser à la place DownloadStringAsync (tout cela dans l'autre thread créé avec BackgroundWorker). Et comme je ne veux pas réécrire mon code tout en ayant à sortir de la boucle et la fonction après avoir appelé DownloadStringAsync, je fis tout droit en boucle après l'appeler qui ne fait rien mais il faut vérifier pour une bool Stop variable que je retourne vrai non plus lorsque le gestionnaire d'événements est appelé DownloadStringCompleted ou lorsque la demande d'utilisateur pour annuler l'opération.

Maintenant, la chose étrange est que cela fonctionne très bien sur la version de débogage; mais sur celui de la libération, le programme se fige dans la boucle while comme si elle était le fil conducteur.

Était-ce utile?

La solution

me semble que vous êtes en attente occupé avec une boucle tout. Vous devez utiliser l'événement de signalisation au lieu, par exemple. un WaitHandle. Une boucle d'attente occupée-en mode de libération peut très bien consommer tout votre cpu, donnant un sentiment d'un gel.

Signal du WaitHandle dans DownloadStringCompleted ou si l'utilisateur annule le téléchargement.

Vérifiez la MSDN docs sur le WaitHandle classe. Il y a aussi un exemple là.

Autres conseils

Envoyez-nous votre boucle while qui vérifie le sommeil cancelation pendant une courte période (quelques ms). Ce bien libérer le moteur d'exécution du processeur pour d'autres threads et processus.

belle sujet, j'utilisé Dans mon processus de travail de fond double tandis que

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

Et j'ai une pause de touche, que quand je le presse, pauseWorker (variable globale ou la propriété) devient vrai et boucles dans le premier alors que seulement, sans augmenter le iCounter, et quand je fais le pauseworker = false à nouveau le processus POURSUIT

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top