2011-09-08 4 views
2

Je viens de créer un petit programme, rien d'extraordinaire, en C# qui ouvre un fichier rdp. Il passe ensuite dans une boucle infinie et continue de vérifier si mstsc est en cours d'exécution, s'il ne l'est pas, s'il ne l'est pas (l'utilisateur a fermé la session), il ré-ouvre. J'ai exécuté le code ci-dessous et il a martelé mon processeur et puis peu de temps après l'écran bleu, minidump dit que c'était parce que "Cela indique qu'une exception s'est produite lors de l'exécution d'une routine qui passe du code non privilégié au code privilégié."C# Execution Loop

Vous ne savez pas ce que cela signifie, mais des idées ce qui ne va pas avec ce code?

static void Main(string[] args) 
{ 
    RDP(); 
    for (int i = 1; i > 0; i++) 
    { 
     foreach (Process clsProcess in Process.GetProcesses()) 
     { 
      if (clsProcess.ProcessName.Contains("mstsc.exe")) 
      { 
      } 
      else 
      { 
       RDP(); 
      } 
     } 
    } 
} 

private static void RDP() 
{ 
    Process rdp = new Process(); 
    rdp.StartInfo = new ProcessStartInfo("C:\\Alistair\\Default.rdp"); 
    rdp.Start(); 
} 

Mise à jour: Je pensais que la puissance de traitement nécessaire à la boucle infinie aurait pu être à blâmer, mais j'ai essayé en boucle 5 fois, mais même résultat.

+0

Définir "Blindé". Est-ce que cela a bloqué tout votre PC? – Justin

+0

Oui, ça m'a donné l'écran bleu de la mort, Valamas a trouvé ce qui le causait et Cody l'a corrigé, voir les réponses ci-dessous –

+0

De quel système d'exploitation s'agissait-il? Vous pouvez envisager de soumettre un rapport de bogue à Microsoft si cela est reproductible. – Justin

Répondre

3
static void Main(string[] args) 
{ 
    RDP(); 
    while(true) 
    { 
     if(Process.GetProcessesByName("mstsc").Length == 0) 
      RDP(); 
     Thread.sleep(300); // Use any value which is confortable with you're request 
    } 
} 

private static void RDP() 
{ 
    Process rdp = new Process(); 
    rdp.StartInfo = new ProcessStartInfo("C:\\Alistair\\Default.rdp"); 
    rdp.Start(); 
} 

Voici une partie du code optimisé, qui ne bloquera pas votre processeur à 100%. Ce que vous pouvez faire est de vérifier l'événement de processus onExit (incertain), ou simplement de vérifier rdp.HasExited si vrai que le redémarrage.

+0

Merci de résoudre définitivement le problème de CPU mais il continue à ouvrir le fichier rdp même si le processus mstsc est en cours –

+0

@Bali C l'essayer maintenant, ça devrait fonctionner car tester avec Process.ProcessName ne devrait utiliser que le processus Nom sans .exe Extension – Burimi

+0

Bravo l'homme, c'est génial, ça marche parfaitement! –

0

Je me demande si Process.GetProcesses(), puisqu'il s'agit d'une méthode, obtient une nouvelle liste de processus. Peut-être essayer de stocker le résultat dans une liste en premier.

+0

Ouais peut-être, mais comment garderais-je la liste à jour, ne garderait-elle pas les mêmes processus que la première boucle? –

+0

Conservez le même code. Juste pourrait garder une liste des processus que vous avez lus. Utilisez ProcessID comme clé pour savoir si le processus a été lu. –

0

Essayez d'attendre le début du processus. Il ne peut pas commencer immidiatly même en théorie.

Deuxième. Vous vérifiez que le processus est en cours d'exécution est incorrect, ce qui entraîne ~ 100 appels à RDP()

using System; 
using System.Diagnostics; 
using System.Threading; 

class Watchdog 
{ 
    static void Main(string[] args) 
    { 
     while(true) { 
      if (!IsRdpRunning()) 
       RunRdp(); 
      Thread.Sleep(1000); 
     } 
    } 

    private static void RunRdp() 
    { 
     Process rdp = new Process(); 
     rdp.StartInfo = new ProcessStartInfo(@"C:\Alistair\Default.rdp"); 
     rdp.Start(); 
     Thread.Sleep(10000); 
    } 

    private static bool IsRdpRunning() 
    { 
      foreach (Process clsProcess in Process.GetProcesses()) 
      { 
       if (clsProcess.ProcessName.Contains("mstsc")) 
       { 
        return true; 
       } 
      } 

      return false; 
    } 
}