2010-10-01 5 views
3

Est-il possible que j'appelle Thread.Sleep(1000) et l'application peut aller dormir pendant une très grande quantité de temps comme une minute ou plus?Problème avec Thread.Sleep

Il semble que cela se passe dans mon application. J'utilise Thread.Sleep et l'application semble se situer au milieu. Lorsque j'appuie sur Ctrl + Alt + Raccourci, il pointe sur la ligne juste avant l'appel Thread.Sleep. Si j'essaie de regarder une variable, elle dit que le Thread est en veille et que la variable n'est pas dans la portée.

EDIT:

public void Write(string command) 
     { 
      _port.WriteLine("\r"); 
      _port.WriteLine(command + "\r"); 
      Thread.Sleep(100); 
     } 
+1

Quelle est la ligne juste * avant * 'Thread.Sleep' alors? –

+0

C'est une ligne à écrire sur le port série ... _port.WriteLine (commande + "\ r"); – Manoj

+0

Postez le code s'il vous plaît! – xxxxxxxxxadfas

Répondre

3

Le thread en veille ne signifie pas nécessairement qu'il se trouve littéralement dans Thread.Sleep; cela signifie simplement que c'est bloqué quelque part. Dans ce cas, il est probablement bloqué à l'intérieur de votre port série pour une raison quelconque, provenant potentiellement d'un problème de port COM plus profond de votre sujet ici: C# COM port communication problem

+0

Ouais, c'est peut-être le même problème à la fin ... J'ai besoin de regarder plus loin. Je pense que je devrais faire une pause et revenir ... – Manoj

1

Il semble que votre appel à Thread.Sleep est même pas être fait. Pourriez-vous ajouter une ligne Debug.WriteLine("About to call sleep"); à votre code juste avant le sommeil? Cela est-il imprimé avant votre retard de plusieurs secondes?

+0

C'est possible. Le problème est que cela se produit au hasard. Je vais vérifier cet angle ... – Manoj

2

Il est possible que Thread.Sleep() prenne plus de temps que le nombre requis de millisecondes pour retourner , en effet très probable, car il ne reviendra pas jusqu'à ce que le thread obtient une tranche de CPU après le temps s'est écoulé.

Cependant, pour que cela prenne une minute entière pour retourner n'est pas très probable.

Il pourrait cependant s'agir de l'instruction la plus lourde dans une boucle qui soit lourde car elle ne devrait pas réellement être en boucle (ou ne devrait pas en faire autant, etc.). Dans ce genre de situation, l'entrée dans le débogueur le fera très probablement au point où le thread dort (puisque c'est l'instruction la plus lourde, c'est la plus susceptible de se casser pour le trouver) même si le vrai problème est une boucle incorrecte, c'est le sommeil qui se trouve comme le «point de problème» en se cassant juste.

Il est également possible que le thread soit endormi ailleurs. Étant donné que vous faites des E/S, je placerais beaucoup d'argent sur le blocage des E/S, c'est le problème. Essayez 1) de vérifier que l'opération d'E/S se produit effectivement et 2) de définir un point d'arrêt avant les E/S et le passage.

1

Thread.Sleep() est une fonction d'utilisation limitée à mon avis. J'ai trouvé que la valeur de timeout passée semble être plus une suggestion qu'une valeur dure de timeout. J'ai trouvé le code suivant pour être plus précis en ce qui concerne l'intervalle de temps:

 ManualResetEvent dummy = new ManualResetEvent(false); 
     dummy.WaitOne(100); 
     //... 
Questions connexes