2010-08-15 5 views
2

Environnement: NET 3.5 application WinFormsC# application WinForms: arrêt/interruption d'une application Windows Forms

Je cherche quelques idées comment arrêter/interrompre une application Windows Form, par exemple quand "quelque chose" prend trop de temps. Un scénario typique consiste à lire une grande quantité de données à partir d'un système dorsal et l'utilisateur doit pouvoir appuyer sur une touche pour arrêter immédiatement le chargement.

  1. Les événements normaux ne sont pas suffisamment réactifs, puisque l'appel backend consomme d'une manière ou d'une autre un temps considérable, ils ne réagissent pas rapidement.
  2. Dans mes méthodes de lecture, j'ai ajouté des vérifications explicites - mais je ne peux pas ajouter de telles vérifications dans des frameworks tiers. De plus, ce n'est pas une très bonne approche.

Peut-être que quelqu'un a une idée sur la façon d'arrêter rapidement et sûrement certaines méthodes en cours d'exécution. Y a-t-il une interruption que je peux utiliser?

Cordialement HW

Répondre

4

événements normaux ne sont pas assez sensibles, puisque l'appel backend consomme en quelque sorte beaucoup de temps

Ce n'est pas comment cela fonctionne. Comprenez que la "boucle des messages" est assez importante, assurez-vous de lire à ce sujet. En un mot, Windows ne peut dire à votre programme qu'un bouton a été cliqué lorsque le thread principal du programme est inactif. Votre fil principal devrait toujours être inactif, prêt à passer à l'action quand un peu de travail doit être fait. Comme peindre votre formulaire ou traiter une frappe. Ou faire quelque chose lorsque l'utilisateur clique sur le bouton Annuler.

Ce qui signifie que quelque chose d'autre doit faire le levage lourd. Un fil. La classe BackgroundWorker est de loin le meilleur moyen de démarrer dans le monde des threads. Il a une méthode CancelAsync(), explicitement conçue pour faire ce que vous voulez faire. Veillez à consulter l'exemple de code fourni dans l'article MSDN Library pour cette méthode.

+0

Merci à tous ceux qui ont aidé. Fondamentalement, vous avez tous eu la même approche, malheureusement ma "réputation" n'est pas bonne pour donner des crédits à vous tous ... –

+1

Bon, je m'en suis occupé. –

+0

Merci Hans, pour les deux ;-) –

2

Exécuter du code long en cours d'exécution dans un thread séparé.

Thread thread; 
void StartLong() 
{ 
    thread = new Thread(SomeMethod); 
    thread.Start(); 
} 

void SomeMethod() 
{ 
    //Long running code here. 
} 

void CancelButton_Click(object sender, EventArgs e) 
{ 
    //... 
    thread.Abort(); 
} 

Si vous n'avez aucun contrôle sur le code qui est long à exécuter. Tout ce que vous pouvez faire, c'est annuler le thread. thread.Abort();

+0

Merci pour votre aide, je l'apprécie vraiment. S'il vous plaît lire le commentaire à la réponse de Hans. –

2

Vous devez faire "long" = tout ce qui dépasse les opérations de 1/5sec dans des threads séparés. La meilleure façon d'effectuer une opération est de lui donner une sorte de "contexte" avec une variable qui indique au travail si l'utilisateur veut abbonner l'opération ou pas.
Si vous n'avez aucun contrôle sur le code effectuant l'opération et que le code est .net, vous pouvez appeler Thread.Abort() mais si le code n'est pas .net, la seule chose que vous pouvez faire est callinfg la fonction api de Windows "terminatethread" mais vous pouvez obtenir des fuites de ressources et des fichiers qui ne sont pas fermés, donc vous devriez penser à utiliser un processus enfant.

+0

Merci pour votre aide, je l'apprécie vraiment. S'il vous plaît lire le commentaire à la réponse de Hans. –

2

Vous pouvez envisager d'utiliser la classe BackgroundWorker, cela permet de travailler directement avec les threads, ce qui en facilite l'implémentation. Vous venez de créer une instance de BackgroundWorker et de lui attacher des gestionnaires d'événements. Here is an example.

+0

Merci pour votre aide, je l'apprécie vraiment. S'il vous plaît lire le commentaire à la réponse de Hans. –

Questions connexes