2008-09-30 6 views
5

J'écris un planificateur ou trie. C'est essentiellement une table avec une liste d'exes (comme "C: \ a.exe") et une application de console qui regarde les enregistrements dans la table toutes les minutes et exécute les tâches qui n'ont pas encore été exécutées.Comment puis-je savoir quand .Net System.Diagnostics.Process a été exécuté avec succès ou a échoué?

Je lance les tâches comme ceci:

System.Diagnostics.Process p = new System.Diagnostics.Process(); 
p.StartInfo.UseShellExecute = false; 
p.StartInfo.FileName = someExe; // like "a.exe" 
p.Start(); 

Comment puis-je savoir si une tâche particulière a échoué? Par exemple, que se passe-t-il si a.exe lève une exception non gérée? Je voudrais que le code ci-dessus sache quand cela se produit et mettre à jour la table des tâches avec quelque chose comme "la tâche particulière a échoué", etc.

Comment est-ce que je peux faire ceci? Je n'utilise pas l'Agent Sql ou le Planificateur Windows parce que quelqu'un d'autre m'a dit de ne pas le faire. Il a plus d'expérience, donc je suis simplement en train de suivre les ordres. N'hésitez pas à suggérer des alternatives.

Répondre

8

Vous pouvez attraper le Win32Exception pour vérifier si Process.Start() a échoué en raison d'un fichier inexistant ou d'un accès d'exécution refusé.

Mais vous ne pouvez pas détecter les exceptions générées par les processus que vous créez avec cette classe. En premier lieu, il se peut que l'application ne soit pas écrite en .NET, de sorte qu'il n'existe peut-être pas de concept d'exception. Ce que vous pouvez faire est de vérifier sur le ExitCode de l'application ou lire les flux StandardOutput et StandardError pour vérifier si les messages d'erreur sont postés.

5

Je pense que vous recherchez Process.ExitCode, en supposant que le processus en retourne un. Vous devrez peut-être utiliser WaitForExit(). Il existe également un événement ErrorDataReceived qui est déclenché lorsqu'une application envoie à stderr.

+0

Voir http://msdn.microsoft.com/en-us/library/system.diagnostics.process.exitcode.aspx pour un exemple de ceci. – marcj

2

En plus du ExitCode, vous pouvez aussi faire quelque chose comme ceci:

string output = p.StandardOutput.ReadToEnd(); 

qui captera tout ce qui aurait été écrit à une fenêtre de commande. Ensuite, vous pouvez analyser cette chaîne pour les modèles connus pour l'affichage des erreurs, en fonction de l'application.

+0

Vous devez faire attention aux conditions de blocage en utilisant ceci! http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardoutput.aspx – hova

0

Pour développer ce que @jop a dit. Vous devrez également attendre la fin du processus. Ainsi:

 p.Start(); 
     p.WaitForExit(); 
     int returnCode = p.ExitCode; 

Les codes autres que zéro sont typiquement des erreurs. Certaines utilisations d'application négative sont des erreurs, et positives comme codes d'état/avertissements.

Questions connexes