2009-12-24 5 views
0

J'ai un programme qui exécute un autre programme et le programme principal continue lorsque ce programme est terminé.Processus .NET dans le planificateur de tâches

Process p = Process.Start("program2.exe"); 

while (!p.HasExited) 
    Thread.Sleep(10000); 

if (p.HasExited) 
{ 
    // Execute more code 
}

Cela fonctionne très bien comme lorsque j'exécute le programme. Mais ne fonctionne pas quand il est utilisé comme une tâche planifiée dans Windows. cette partie ne s'exécute jamais

if (p.HasExited) 
{ 
    // Execute more code 
}

Impossible de trouver un moyen de déboguer cela. J'ai été bloqué sur ce programme pendant une semaine maintenant.

+0

êtes-vous sûr Process p = Process.Start ("program2.exe"); même exécuté en premier lieu? –

+0

Je suis d'accord, il est possible que p ne démarre jamais réellement, donc il va à HasExited immédiatement. Vous pouvez vérifier son code de sortie pour voir s'il y a eu un problème. – GrayWizardx

+0

BTW, le langage de programmation C# n'a pas de processus. .NET fait. –

Répondre

1

Votre code serait plus simple si vous supposez qu'une fois p.HasExited est vrai, il reste ainsi. Vous pouvez ensuite supprimer l'instruction if. Ensuite, il n'y a que trois façons que je peux voir que votre code peut donner le résultat que vous voyez:

  1. Le deuxième processus ne se termine jamais. Pouvez-vous le voir dans le Gestionnaire des tâches?
  2. Votre code génère une exception. Enregistrez-vous des exceptions quelque part?
  3. Le deuxième processus se termine, mais ne signale jamais HasExited.

Pouvez-vous essayer d'enquêter et d'éliminer d'abord 1 et 2? C'est une bonne idée de regarder les alternatives simples en premier. Mise à jour: À partir des commentaires Andrew Keith a également suggéré que le code pourrait ne pas être exécuté du tout. Insérez des relevés de journaux de manière libérale afin de pouvoir voir exactement ce qui se passe. Connectez-vous à un fichier par exemple.

+0

comment j'insérerais la fonction de notation? et où? im new to C# merci – Peter

+0

Si vous voulez intégrer la journalisation dans votre projet, vous pouvez regarder [log4net] (http://logging.apache.org/log4net/index.html). Si vous voulez quelque chose de plus léger, vous pouvez utiliser [System.Diagnostics.Trace] (http://msdn.microsoft.com/en-us/library/system.diagnostics.trace.aspx). –

0

Ma conjecture est un problème de sécurité lié à l'utilisateur que la tâche planifiée exécute. C'est à dire: le programme fonctionne bien comme vous, mais en tant qu'utilisateur de tâches planifiées, il n'est pas autorisé à exécuter "program.exe" (ou pire encore, vous programmez).

Vous pouvez consulter le journal du planificateur de tâches (dans le menu avancé du panneau de configuration du planificateur de tâches). Il devrait donner un code de sortie pour votre tâche comme zéro (ou peut-être un). Quelque chose ne va pas si vous obtenez un très grand code de sortie.

Oh, et Process.WaitForExit() est probablement plus propre que votre boucle d'interrogation.

Questions connexes