J'essaie de comprendre ce que je peux et je ne peux pas faire avec les travailleurs de fond. J'ai vu une bonne quantité de postes à ce sujet, mais tout semble impliquer une certaine opération avec des boucles et vous annuler une opération dans une boucle. Je veux savoir si je peux annuler une certaine opération sur un ouvrier de fond sans boucle.
J'ai la forme simple suivante que je joue avec:
qui contient le code suivant: p> qui charge un tableau de chaîne avec beaucoup de données factices. La méthode du bouton de démarrage est la suivante: p> et j'ai aussi: p> donc vous remarquerez que mon BW_DOWORK CODE> La méthode ne contient aucune boucle, une seule opération et je souhaite savoir si: p>
showworkinglabel code> pendant que les travaux d'arrière-plan se produisent de sorte qu'il affiche en permanence
"". "," ... ", et ensuite retour à
"." code> comme une barre de progression pour indiquer que le travail est toujours sur li>
ol> p>
3 Réponses :
Selon le Page MSDN pour Backworker :
Lors de la création du travailleur, vous pouvez le faire supporter l'annulation en définissant p> Vous pouvez demander l'annulation en appelant Ensuite, votre travailleur d'arrière-plan doit vérifier périodiquement la propriété code> code> propriété, et si défini sur La page MSDN que j'ai liée a des exemples supplémentaires d'utilisation en code réel. p> p> annulasync () code> sur le Travalilleur d'information. P>
true code>, il devrait annuler son fonctionnement. Comme Sir Rufo a souligné dans un commentaire, n'oubliez pas de l'intérieur du délégué
Dowork code> Vous devez définir
doworkeventargs.cancel code> sur
true code>. < / p>
Vous devez d'abord prendre en charge l'annulation alors vous devez partager un jeton d'annulation au niveau de formulaire P> à l'intérieur de votre travail que vous avez Besoin de lancer l'annulation: p> ou le gérer gracieusement avec l'ouvrier d'arrière-plan, même pour les annulations en attente: Utilisation de votre code, il deviendra quelque chose de similaire à l'indication Backworker.CancellationPendant Code> P> P> P> P> P> P > Et dans le bouton CANCELL, vous pouvez appeler l'annulation comme ceci: p>
Le travail d'arrière-plan a une stratégie intégrée pour l'annulation - aucun besoin de cancellationToken. Ceci est un exemple comment pas b> pour gérer l'annulation sur un travailleur d'arrière-plan
Cette approche présente l'utilisateur à une approche plus moderne pour attendre ASYNC. Je l'ai également testé avant de poster pour que cela fonctionne. En outre, il serait agréable de voir d'autres approches sur d'autres réponses!
BTW RÉGLAGE BASHWORKER.SUPPORTSCANCANNATION À TRUE ET APPELANT Backgrioundworker.Cancelasync () est inutile dans ce cas.
Il est nécessaire de définir l'annulation des supports, sinon cette approche ne fonctionnera pas. Je répète que j'ai exécuté ce code exact sur ma machine avant de la publier.
Supprimer BW.WORKERSUPPORTSCANCANNATION = TRUE; CODE> et
CANCellationToken.register (BW.CANCELASYNC); code> et essayez-le à nouveau. Cela fonctionnera aussi. Ces lignes de code sont inutiles, car vous n'avez pas utilisé le support d'annulation de Backgroudworker.
Dès que je serai à la maison, je vais essayer ça, merci. Mais cette réponse est valide et cela fonctionne également par le jeton d'annulation de gêne, il est possible de le transmettre à des piles de code / logiques plus complexes, donc je pense que je garderai cette réponse.
Voici un exemple de travail à l'aide de la prise en charge de l'annulation de l'entreprise de fond.
private CancellationTokenSource cts; private async void StartWork_Click( object sender, EventArgs e ) { showWorkingLabel.Text = "Work started ..."; cts = new CancellationTokenSource(); var token = cts.Token; try { TestDataList = await Task.Run( () => { return this.TestData .Cast<string>() .Select( ( s, i ) => { token.ThrowIfCancellationRequested(); return new { GroupIndex = i / 100, Item = s.Trim().ToLower() }; } ) .GroupBy( g => g.GroupIndex ) .Select( g => { token.ThrowIfCancellationRequested(); return string.Join( ",", g.Select( x => x.Item ) ); } ) .ToList(); }, token ); showWorkingLabel.Text = "Work completed."; } catch ( OperationCanceledException ) { showWorkingLabel.Text = "Work canceled."; } catch ( Exception ex ) { showWorkingLabel.Text = "Work faulted - " + ex.Message; } } private void btnCancel_Click( object sender, EventArgs e ) { cts.Cancel(); showWorkingLabel.Text = "Work cancellation requested ..."; }
Pouvez-vous ajouter la version .NET que vous utilisez s'il vous plaît?
Dupliqué possible de Annulation d'un travail d'arrière-plan
docs.microsoft.com/fr- US / DotNet / API / ...
Vous devez déclarer
Backworker BW code> comme
formulaire code> niveau ..
Il n'est pas inhabituel du tout que vous ne trouvez pas un moyen d'annuler une opération. Ce qui a tendance à être d'accord, peu importe d'être humain qu'il traitait pendant un certain temps, tant que l'événement ponctuel sait que cela ne devrait pas utiliser le résultat de l'opération. Donc, dites 5 secondes, ça va. Mais si cela prend plus de temps, cela devient un problème, difficile de fermer la fenêtre pour un. Vous aurez ensuite besoin de trouver un moyen de casser l'opération afin que vous puissiez insérer le chèque d'annulation. Donc, pas utiliser Linq par exemple. Googling "Plinq Annuler" pourrait aider.