2011-02-12 2 views
3

Comme demandé dans this post, il existe deux façons d'appeler un autre processus en C#.Process.Start vs Process `p = new Process()` en C#?

Process.Start("hello"); 

Et

Process p = new Process(); 
p.StartInfo.FileName = "hello.exe"; 
p.Start(); 
p.WaitForExit(); 
  • Q1: Quels sont les avantages/inconvénients de chaque approche?
  • Q2: Comment vérifier si une erreur survient avec la méthode Process.Start()?

Répondre

6

Avec la première méthode que vous pourriez ne pas être en mesure d'utiliser WaitForExit, comme la méthode renvoie null si le processus est en cours d'exécution.

Comment vous vérifiez si un nouveau processus a été démarré diffère entre les méthodes. Le premier retourne un objet ou Processnull:

Process p = Process.Start("hello"); 
if (p != null) { 
    // A new process was started 
    // Here it's possible to wait for it to end: 
    p.WaitForExit(); 
} else { 
    // The process was already running 
} 

Le second renvoie une bool:

Process p = new Process(); 
p.StartInfo.FileName = "hello.exe"; 
bool s = p.Start(); 
if (s) { 
    // A new process was started 
} else { 
    // The process was already running 
} 
p.WaitForExit(); 
6

Pour les cas simples, l'avantage est principalement la commodité. Évidemment, vous avez plus d'options (chemin de travail, choix entre shell-exec, etc.) avec la route ProcessStartInfo, mais il y a aussi une méthode statique Process.Start (ProcessStartInfo).

Re vérification des erreurs; Process.Start renvoie l'objet Process, vous pouvez donc attendre la sortie et vérifier le code d'erreur si vous en avez besoin. Si vous voulez capturer stderr, vous voulez probablement l'une des approches ProcessStartInfo.

+0

Pourriez-vous me donner un exemple? Si on doit obtenir un objet et attendre la sortie, il me semble qu'il n'y a aucune raison d'utiliser Process.start() pour des raisons de simplicité. – prosseek

+0

@prosseek ok; imaginez que vous voulez capturer stdout et stderr, l'exécuter dans le compte d'un autre utilisateur, et obtenir un événement quand il se termine. Mais oui; Pour les cas simples, la méthode statique est plus facile. –

1

Très petite différence. La méthode statique retourne un objet de processus, vous pouvez toujours utiliser le "p.WaitForExit()" etc - en utilisant la méthode où vous créez un nouveau processus, il serait plus facile de modifier les paramètres du processus (affinité du processeur et autres) avant de lancer le processus.

Autre que cela - pas de différence. Un nouvel objet de processus est créé dans les deux sens.

Dans votre deuxième exemple - qui est identique à ceci:

Process p = Process.Start("hello.exe"); 
p.WaitForExit();