2010-07-09 4 views
0

J'ai un programme vb.net 2.0, qui a une routine de lot/file d'attente pour exécuter des tâches qui prennent longtemps. L'une des tâches est "upload to ftp" de fichiers volumineux. La file d'attente est démarrée par l'utilisateur en cliquant sur le bouton "Démarrer", puis une boucle for tourne sur chaque élément de lot, et fait tout ce dont il a besoin.Comment puis-je implémenter un bouton d'annulation pour une routine de lot/file d'attente?

Maintenant, je veux mettre en œuvre un bouton "annuler l'exécution de la file d'attente". Le bouton doit être cliquable (le gui ne doit pas être bloqué par la file en cours d'exécution), et le bouton doit arrêter l'action de la file d'attente actuelle (je ne me soucie pas de l'annulation des tâches précédemment exécutées).

Je suppose que j'ai besoin de threads séparés et d'un système de notification, mais à quel moment dois-je vérifier si la notification est envoyée? Dans la boucle de la file d'attente? Mais alors l'utilisateur devra attendre le téléchargement complet du fichier avant la pause, ce qui n'est pas ce qu'il veut. Dans la méthode "upload de fichier"? C'est mettre trop de code dans une méthode, je le sens intuitivement.

J'ai également besoin de faire un peu de nettoyage des actions de l'élément de lot en cours (comme supprimer le fichier partiellement téléchargé), donc cela doit être pris en compte quelque part aussi.

Des suggestions dans le code de haut niveau ou avec des exemples? Merci d'avance!

Répondre

0

Une solution consiste à créer un Thread qui exécute l'action que vous souhaitez annuler, puis l'abandonner quand vous voulez qu'il disparaisse.

// this thread does the cancellable work 
Thread actor; 

// this is a very simple example, yours will be more complex 
public void PerformAction(){ 
    if(actor != null) // this sample code is not reentrant 
    throw new InvalidOperationException("lol"); 
    actor = new Thread(Work); 
    actor.Start(); // async 
} 

// awesome code, dude 
private void Work(object state) 
{ 
    ImpressiveLibrary.MethodsThatLastForever.DoSomethingAmazing(); 
} 

// kills the actor, if it is not null. 
// reentrant, but not thread safe. Can you figure out why? 
public void KillAction(){ 
    var foo = actor; 
    actor = null; 
    if(foo != null) 
    foo.Abort(); 
} 
Questions connexes