2011-10-24 8 views
0

J'ai un programme écrit en C# (Visual Studio), qui fonctionne sur un plateau. Je veux qu'il fasse une action toutes les 10 minutes. Je code suivant maintenant:Comment faire une pause asynchrone en C#?

while(true) 
{ 
Thread.Sleep(10000); 
// my stuff 
} 

Mais cela ne fonctionne pas. Il gèle un programme. Thread.Sleep fait dormir la tête d'appel pendant une durée de temps X.

+1

La méthode 'Sleep' prend le nombre de _milliseconds_ comme paramètre. Donc, si vous voulez dormir pendant 10 minutes, vous devriez écrire 'Sleep (600000)'. –

Répondre

6

Vous devez utiliser l'objet timer et ne pas créer de boucle while.

System.Timers.Timer _timer = new System.Timers.Timer(); 
_timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed); 
//30 seconds 
_timer.Interval = 30000; 
_timer.Start(); 

private void _timer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    //do your logic 
} 
+0

Préférez utiliser la classe System.Threading.Timer plutôt que la classe System.Timers.Timer. Juste un peu de Jeffrey Richter ... –

+0

Quelle est la différence entre eux? –

+0

Le lien ci-dessous montre la différence entre eux http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/656f8b0f-77f7-42a7-a34c-0325ffef6c0a –

2

Si ce thread est le thread frontal (celui responsable de la gestion des messages), il fige l'application car tout message de gestion d'événements ou de repeint ne sera pas manipulé jusqu'à ce que le thread se réveille et ait une chance de gérer les messages.

Ce que vous devez faire est de planifier cette logique toutes les 10 secondes. Supprimez une minuterie sur votre formulaire et spécifiez-la pour qu'elle s'exécute toutes les 10 secondes. Dans l'événement Tick, appelez votre action personnalisée.

1

Thread.Sleep "arrête" l'unité d'exécution en cours. Si vous n'avez qu'un seul thread, tout est mis en pause.

Que voulez-vous réaliser?

Peut-être vous avez besoin d'un second fil, ou peut-être la meilleure solution d'une minuterie qui déclenche une action toutes les 10 minutes

s. Par ailleurs, vous «veillez» pendant 10 secondes, pas les minutes. Task.StartNew() ou ThreadPool

Questions connexes