2009-02-22 2 views
4

Comment conserver ma forme C# qui, disons, est dans une boucle forcée, de se bloquer? Dois-je appeler Application.DoEvents(); avant la boucle ou après? D'après ce que j'ai entendu en utilisant la méthode DoEvents empêchera mon application de se bloquer.Application.DoEvents();

Répondre

11

Vous ne devez pas utiliser Application.DoEvents() pour que votre application reste active.

L'appel de cette méthode permettra à tous les messages Windows en attente d'être distribués. Cela signifie que si un utilisateur clique sur un bouton (ou effectue une autre interaction avec l'utilisateur), cette action sera traitée. Cela peut donc provoquer une réentrée. Si elles pressent le même bouton que celui qui a causé la boucle que vous traitez, vous finirez par avoir la routine appelée à nouveau avant que vous ayez fini! Au lieu de cela, vous devez utiliser un thread BackgroundWorker pour effectuer le long processus, puis une fois l'action terminée, effectuez toutes les actions supplémentaires requises. Par exemple, une fois que vous appuyez sur un bouton, vous démarrez le thread de travail, puis vous désactivez le bouton afin qu'il ne puisse plus être pressé. Une fois le thread de travail terminé, vous activez à nouveau le bouton.

1

Il existe plusieurs façons, cela (DoEvents) force la pompe à messages pour traiter les messages. Certaines personnes mettent un Thread.Sleep à la fin d'une boucle (toujours à l'intérieur de la boucle) dans un thread. Que faites-vous exactement dans votre fil, car il pourrait y avoir une meilleure façon d'atteindre votre objectif globalement?

1

Si le processus est à l'origine de l'interface utilisateur de verrouiller pour une quantité inacceptable de temps, essayez d'utiliser un fil séparé (soit créer, utiliser le pool de threads, ou utiliser la classe BackgroundWorker.