0
votes

Annulation immédiate d'un ouvrier de fond au milieu d'une opération

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:

 Entrez la description de l'image ici

qui contient le code suivant: xxx < / Pré>

qui charge un tableau de chaîne avec beaucoup de données factices. La méthode du bouton de démarrage est la suivante: xxx

et j'ai aussi: xxx

donc vous remarquerez que mon BW_DOWORK La méthode ne contient aucune boucle, une seule opération et je souhaite savoir si:

  1. Si je peux tuer / annuler le travailleur d'arrière-plan en cliquant sur le bouton Annuler pendant l'exécution du code suivant: xxx
    1. Puis-je mettre à jour l'étiquette showworkinglabel pendant que les travaux d'arrière-plan se produisent de sorte qu'il affiche en permanence "". "," ... ", et ensuite retour à "." comme une barre de progression pour indiquer que le travail est toujours sur

5 commentaires

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 comme formulaire 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.


3 Réponses :


1
votes

Selon le Page MSDN pour Backworker :

Lors de la création du travailleur, vous pouvez le faire supporter l'annulation en définissant xxx

Vous pouvez demander l'annulation en appelant annulasync () sur le Travalilleur d'information.

Ensuite, votre travailleur d'arrière-plan doit vérifier périodiquement la propriété propriété, et si défini sur true , 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 Vous devez définir doworkeventargs.cancel sur true . < / p>

La page MSDN que j'ai liée a des exemples supplémentaires d'utilisation en code réel.


0 commentaires

1
votes

Vous devez d'abord prendre en charge l'annulation xxx

alors vous devez partager un jeton d'annulation au niveau de formulaire xxx

à l'intérieur de votre travail que vous avez Besoin de lancer l'annulation: xxx

ou le gérer gracieusement avec l'ouvrier d'arrière-plan, même pour les annulations en attente: Backworker.CancellationPendant Et dans le bouton CANCELL, vous pouvez appeler l'annulation comme ceci: xxx

Utilisation de votre code, il deviendra quelque chose de similaire à l'indication suivante, vous devez gérer des annulations gracieuses : xxx


6 commentaires

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 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; et CANCellationToken.register (BW.CANCELASYNC); 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.



0
votes

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 ...";
}


0 commentaires