8
votes

Comment puis-je mettre en pause un travailleur d'arrière-plan? Ou quelque chose de similaire

J'utilisais un travail d'arrière-plan pour télécharger certains sites Web en appelant webclient.downloadstring à 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 chaque fois que j'ai trouvé que cancellationpendant était au milieu de la boucle.

Mais maintenant j'ai remarqué que la fonction téléchargnetring est parfois parfois gèle, donc j'ai décidé d'utiliser downloadstringasync à 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 , 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 que je tourne moins soit lorsque le gestionnaire d'événements DownloDstringScompled (code> est appelé ou lorsque l'utilisateur demande d'annuler l'opération.

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.


0 commentaires

3 Réponses :


0
votes

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.


3 commentaires

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)



4
votes

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.

Signalez le WAITHANDLE dans DownloDStringCompletted ou si l'utilisateur annule le téléchargement.

vérifier le MSDN Docs sur le WAITHANDLE classer. Il y en a aussi un exemple là-bas.


1 commentaires

Pause / Reprendre la boucle dans le travailleur d'arrière-plan Stackoverflow.com / Questions / 8359058 / ...



0
votes

beau sujet, j'ai utilisé Dans mon processus de travail de fond, un double tandis que xxx

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


0 commentaires