J'ai un thread en cours d'exécution qui délègue certaines tâches. Quand une seule tâche est terminée, un événement est levé en disant qu'il est terminé. Ces tâches doivent être exécutées dans un ordre spécifique et doivent attendre la fin de la tâche précédente. Comment puis-je faire attendre le thread jusqu'à ce qu'il reçoive l'événement "task completed"? (Mis à part le gestionnaire d'événement évident qui définit un indicateur, puis une boucle while interrogeant le drapeau)Quelles méthodes peuvent être utilisées pour que le thread attende un événement, puis continue son exécution?
Répondre
J'utilise souvent la poignée AutoResetEvent
d'attente quand je dois attendre une tâche asynchrone pour terminer:
public void PerformAsyncTasks()
{
SomeClass someObj = new SomeClass()
AutoResetEvent waitHandle = new AutoResetEvent(false);
// create and attach event handler for the "Completed" event
EventHandler eventHandler = delegate(object sender, EventArgs e)
{
waitHandle.Set(); // signal that the finished event was raised
}
someObj.TaskCompleted += eventHandler;
// call the async method
someObj.PerformFirstTaskAsync();
// Wait until the event handler is invoked
waitHandle.WaitOne();
// the completed event has been raised, go on with the next one
someObj.PerformSecondTaskAsync();
waitHandle.WaitOne();
// ...and so on
}
Une option consisterait à utiliser un EventWaitHandle pour signaler l'achèvement.
Vous pouvez utiliser un ManualResetEvent pour cela.
Le thread qui doit traiter en premier prend simplement le resetEvent, et attend la fin de Set the event.
Le thread qui doit attendre peut contenir un handle et appeler resetEvent.WaitOne(). Cela bloquera ce thread jusqu'à la fin du premier.
Cela vous permet de gérer le blocage et la commande des événements d'une manière très propre.
J'ai eu de bons résultats en utilisant une méthode de rappel que le thread de travail appelle lorsqu'il est terminé. Il bat l'interrogation et facilite le renvoi des paramètres à l'appelant.
- 1. Quelles colonnes peuvent être utilisées dans la clause OUTPUT INTO?
- 2. Quelles API peuvent être utilisées pour afficher différents fonds d'écran sur un système à plusieurs moniteurs?
- 3. Des annotations peuvent-elles être utilisées pour l'injection de code?
- 4. Quelles fonctionnalités C# 4.0 peuvent être utilisées tout en ciblant le runtime .NET 3.5?
- 5. Quelles fonctionnalités de .NET 3.5 peuvent être utilisées dans une application .NET 2.0?
- 6. Quelles sont les méthodes pouvant être utilisées pour éviter qu'une page ne soit mise en cache par le navigateur?
- 7. Les méthodes Web peuvent-elles être surchargées?
- 8. Que signifie être un thread démon?
- 9. Est-ce que les commandes ajax d'asp.net peuvent être utilisées comme contrôles côté client pur?
- 10. Quelles propriétés CSS peuvent être appliquées aux éléments HTML?
- 11. Les fonctions virtuelles peuvent-elles être utilisées dans les valeurs de retour?
- 12. Exécution de la classe en tant que nouveau thread
- 13. Des transformations personnalisées peuvent-elles être utilisées (en théorie) pour créer un effet d'ondulation de l'eau sur un CALayer?
- 14. Déclenchement d'une méthode pour exécution dans un thread séparé
- 15. La capture et la substitution de regex peuvent-elles être utilisées avec une directive Apache DirectoryMatch?
- 16. Méthodes de simulation utilisées dans les méthodes statiques
- 17. Comment puis-je faire référence à un contrôle dans son événement? (sans utiliser son nom)
- 18. Référence pour les méthodes C utilisées dans le développement de l'iPhone
- 19. Quelles fonctions C/C++ sont le plus souvent utilisées de manière incorrecte et peuvent conduire à des dépassements de tampon?
- 20. jQuery: enfant tirant un événement pour son élément parent
- 21. JBoss Seam - Les annotations Can not @In peuvent-elles être utilisées en même temps avec des méthodes d'accès pour différentes propriétés?
- 22. Quelles techniques génériques peuvent être appliquées pour optimiser les requêtes SQL?
- 23. Les classes de Java qui implémentent runnable peuvent-elles avoir des méthodes autres que run()?
- 24. Quels types d'exécutables peuvent être décompilés?
- 25. Puis-je exécuter un thread plusieurs fois?
- 26. Les événements Can peuvent-ils être inter-processus?
- 27. Toutes les tâches de workflow affectées doivent-elles être terminées pour que le flux de travail continue à fonctionner?
- 28. Exécution de SimpleXMLRPCServer dans un thread séparé et fermeture
- 29. Les autorisations requises ne peuvent être acquises
- 30. Exécution d'un flux de socket dans un thread
Basé sur la première réponse, je fais quelque chose de très similaire à cela. Quelle est la différence entre AutoResetEvent et EventWaitHandle initialisé avec EventResetMode.AutoReset? – MGSoto
@MGSoto: Je pense que la différence est minime (le cas échéant): 'AutoResetEvent' hérite de' EventWaitHandle', et semble utiliser le constructeur de sa classe de base pour lui passer 'EventResetMode.AutoReset'. –
N'oubliez pas que AutoResetEvent, WaitHandles etc implémente IDisposable –