J'utilisais un travail d'arrière-plan code> pour télécharger certains sites Web en appelant Mais maintenant j'ai remarqué que la fonction Maintenant, la chose étrange est que cela fonctionne bien sur la version de débogage; Mais sur la libération, le programme gèle dans la boucle tandis que si c'était le fil principal. p> webclient.downloadstring code> à l'intérieur d'une boucle. Je voulais que l'option de l'utilisateur annule au milieu du téléchargement de choses, donc j'ai appelé
annulasync code> chaque fois que j'ai trouvé que
cancellationpendant code> était au milieu de la boucle. p>
téléchargnetring code> est parfois parfois gèle, donc j'ai décidé d'utiliser
downloadstringasync code> à la place (tout cela à l'intérieur de l'autre fil créé avec
Backworker < / code>). Et puisque je ne veux pas réécrire mon code entier en devoir quitter la boucle et la fonction après avoir appelé
downloadstringasync code>, j'ai fait une boucle tandis que vous avez fait une boucle de temps juste après l'avoir appelé qui ne fait que faire une variable < Code> BOOL STOP CODE> que je tourne moins soit lorsque le gestionnaire d'événements code> DownloDstringScompled (code> est appelé ou lorsque l'utilisateur demande d'annuler l'opération. p>
3 Réponses :
Envoyez votre boucle tandis que vous vérifiez l'annulation pour dormir pendant un court-circuit (certaines ms). Cela bien libérer le temps d'exécution du processeur pour d'autres threads et processus. P>
Occupé à attendre est une mauvaise pratique.
Je sais et je ne savais pas qu'il y avait quelque chose comme un waihandle dans c # /. Net (toujours de nouvelles choses à apprendre :-)), mais parfois le sondage est la seule solution et il faut ensuite veiller à ce que le processus interroger uniquement. Une fois puis abandonne le temps de la CPU (sous Linux sa fonction de rendement ()) donnée au thread / processus par le système d'exploitation.
Les gauchons peuvent également être utilisés avec un délai d'attente, de sorte que cela empêcherait le sondage :) (et j'ai utilisé ma part d'attente occupée jusqu'à ce que je sage plus sage .. hehe)
Cela me semble que vous êtes occupé avec une boucle de temps. Vous devez utiliser la signalisation des événements à la place, par exemple. un waithandle. Une boucle d'attente occupée en mode de libération pourrait très bien consommer tout votre CPU, donnant une sensation de gel. P>
Signalez le WAITHANDLE dans DownloDStringCompletted ou si l'utilisateur annule le téléchargement. P>
vérifier le MSDN Docs sur le WAITHANDLE classer. Il y en a aussi un exemple là-bas. P>
Pause / Reprendre la boucle dans le travailleur d'arrière-plan Stackoverflow.com / Questions / 8359058 / ...
beau sujet, j'ai utilisé
Dans mon processus de travail de fond, un double tandis que et j'ai une pause de bouton, que lorsque j'appuie dessus, Pauseworker (variable globale ou propriété) devient vrai et boucles dans le premier moment, sans Augmentation de l'idiot, et lorsque je fais la Pauseworker = Faux à nouveau, le processus continue P> P>