Comment asynchrone attendre x secondes et d'exécuter quelque chose, alors?
Je sais qu'il est Thread.Le sommeil
et System.Windows.Forms.Timer
et Moniteur.Attendre
en C# et Windows Forms. Je n'arrive pas à être en mesure de comprendre comment attendre X secondes, puis faire autre chose sans verrouiller le fil.
J'ai un formulaire avec un bouton. Sur le bouton cliquez sur une minuterie doit démarrer et attendez 5 secondes. Après ces 5 secondes, un autre contrôle sur le formulaire est de couleur verte. Lors de l'utilisation de Thread.Sleep
, l'ensemble de l'application ne répondait plus de 5 secondes - alors, comment dois-je tout simplement "faire quelque chose au bout de 5 secondes"?
Utilisez simplement
Nous sommes ajout d'une nouvelle fonctionnalité de C# 5 que ce genre d'opération asynchrone beaucoup plus facile; si vous êtes intéressés à obtenir un pic, commencer avec ce blog: blogs.msdn.com/b/csharpfaq/archive/2011/04/13/...
Façon d'aller de Microsoft!
System.Windows.Forms.Timer
. Réglez la minuterie pour 5 secondes, et la poignée de la Tick
événement. Lorsque l'événement est déclenché, faire la chose.Nous sommes ajout d'une nouvelle fonctionnalité de C# 5 que ce genre d'opération asynchrone beaucoup plus facile; si vous êtes intéressés à obtenir un pic, commencer avec ce blog: blogs.msdn.com/b/csharpfaq/archive/2011/04/13/...
Façon d'aller de Microsoft!
OriginalL'auteur Dennis G | 2012-02-02
Vous devez vous connecter pour publier un commentaire.
(transcrit à partir Ben comme commentaire)
...et désactiver la minuterie (IsEnabled=false) avant de faire votre travail dans oder pour supprimer un deuxième.
L'événement Tick peut être exécuté sur un autre thread ne peut pas modifier votre interface, vous pouvez prendre ce:
Juste pour être complet: avec async/await, on peut retarder l'exécution de quelque chose de très facile (un coup, de ne jamais répéter l'invocation):
Pour en savoir plus, voir "async et await" dans MSDN.
.BeginInvoke(myTimer_Tick, sender, e)
ne fonctionne pas parce que l'Argument de "la méthode de type de groupe n'est pas assignable à système.déléguéPS: si l'intervalle n'était pas aussi longtemps que 5 secondes, vous auriez besoin de certains de verrouillage pour empêcher un deuxième tique à exécuter avant le premier avait une chance pour désactiver la minuterie.
mtijn: édité réponse à refléter les bons points.
est attendent Tâche.Delay(1000), n'équivaut pas à enfiler.Sleep(1000)?
OriginalL'auteur eFloh
Vous pouvez démarrer une tâche asynchrone qui effectue votre action:
[MODIFIER]
Pour passer l'intervalle il vous suffit de le stocker dans une variable:
[/EDIT]
Pas une bonne idée. Vous kidnapper une PoolThread pendant 5 secondes ici. Et puis, il suffit d'utiliser Invoke() pour obtenir du fil.
J'ai prolongé l'exemple de passer de l'intervalle.
Sommes-nous court sur les Threads?
Oui, toujours. Et le pool de threads est prévu à court (< 500 ms) des tâches. Vous perturber sa charge l'équilibrage de la loi.
OriginalL'auteur PVitt
Avez-vous essayé
Vous pouvez l'utiliser comme ceci:
référence: https://msdn.microsoft.com/en-us/library/hh194873(v=vs. 110).aspx
OriginalL'auteur macio.Jun
Vous êtes à la recherche à ce mal.
Cliquez sur le bouton, elle lance un chronomètre avec un intervalle de x secondes. Lorsque ceux-ci sont, c'est eventhandler l'exécution de la tâche.
Donc, ce que vous ne voulez pas de se produire.
Tandis que les x secondes sont écoulées.?
Alors que La tâche est en cours d'exécution?
Si, par exemple, c'est que vous ne voulez pas le bouton à cliquer jusqu'à ce retard et les tâches sont effectuées. Désactiver le bouton gestionnaire de clic, et l'activer sur l'achèvement de la tâche.
Si tout ce que vous voulez, c'est un cinq secondes de retard avant la tâche, vous devez passer le délai de démarrage de la tâche et de le laisser prendre soin d'elle.
OriginalL'auteur Tony Hopkinson
votre application se bloque parce que vous êtes en invoquant les 5 secondes en veille/attente sur le main thread d'INTERFACE utilisateur. mettre la veille/attente/quelle que soit l'action dans un thread séparé (en fait le Système.De Windows.Les formulaires.Minuterie devrait le faire pour vous) et lorsqu'elle est terminée appeler l'action qui transforme un certain contrôle vert. n'oubliez pas de vérifier InvokeRequired. voici un court échantillon (SetText peut être appelé à partir d'un autre thread, si c'est l'appel au lieu d'être invoquée sur l'INTERFACE principale thread où la zone de texte est sur):
J'ai pris l'exemple de ici (bien intéressant à lire!).
Voir Contrôle.Invoquer
Invoke est de la magie. Super!
OriginalL'auteur mtijn
@eFloh dans le post marqué comme réponse dit:
Qui n'est pas ce que les docs disent.
Vous êtes à l'aide d'un Système.De Windows.Les formulaires.Minuterie de votre code d'exemple.
C'est un Formes.Minuterie.
Selon le C# docs les événements de la Minuterie sont soulevées sur le thread d'INTERFACE utilisateur.
Voir aussi stackoverflow poster ici
OriginalL'auteur deegee
Je pense que ce que vous cherchez est
System.Timers
... je ne pense pas que vous devez définir un CWND minuterie pour ce que vous essayez de faire: Avoir un regard sur http://msdn.microsoft.com/en-us/library/0tcs6ww8(v=VS.90).aspx pour un exemple. Il devrait faire l'affaire.OriginalL'auteur Ahmed Masud