2017-05-11 1 views
-1


J'essaie d'exécuter un autre processus à partir du principal en utilisant la classe Process.Process.StartInfo clarifications C#

AudioRecordProcess = new Process(); 
AudioRecordProcess.StartInfo.UseShellExecute = false; 
AudioRecordProcess.StartInfo.FileName = @"RecordAudio\RecordAudio"; 
AudioRecordProcess.StartInfo.CreateNoWindow = true; 

Le processus commence bien, mais:

  • Même si je mets propriété CreateNoWindow quand je lance le code d'une fenêtre est créée (l'autre processus est un projet WPF avec juste la fenêtre principale);
  • Lorsque j'essaie de fermer le processus avec la fenêtre de fermeture, cela ne ferme rien. La fenêtre passe juste sous le processus principal 'un.
  • Si j'essaie de supprimer le processus du code, il n'exécute pas les instructions dans la fenêtre principale de fermeture de l'événement, mais si je le ferme à partir de la barre des tâches, il exécute cette routine. Les actions ne devraient-elles pas être les mêmes?

Une idée pour ce comportement étrange?
Merci

+0

Cela dépend de ce que vous exécutez! tandis que le spectacle aucune fenêtre n'est passée à la commande d'exécution de l'application (alors qu'il devrait) n'a pas à l'honorer pour les autres fenêtres, il se sent comme vomir – BugFinder

+0

Pouvez-vous mieux expliquer.J'ai compris qu'il ne peut pas fonctionner pour chaque type de programme, donc je devrais supposer que WPF n'est pas compatible avec l'option nowindow. Je n'ai pas compris "n'a pas à l'honorer pour toutes les autres fenêtres, il se sent comme vomir". Qu'en est-il de la partie finale? –

+0

tout processus que vous engendrez peut et fera ce qu'il veut .. et selon l'application, vous avez peut-être engendré un processus, mais à moins que vous ne terminiez ce processus en fermant votre application ne le terminera – BugFinder

Répondre

0

Classe 'Process' est utilisé pour créer et/ou contrôler et surveiller des processus spécifiques.

  • application console uniquement obéira CreateNoWindow = true, alors que Windows Forms et WPF applications ignorera.

  • Étant donné que vous avez démarré un autre processus sur le système, ce processus continuera seul et ne sera pas arrêté une fois que vous aurez arrêté le processus parent . Cependant, certaines ressources subsistent (en particulier thread et handle) dans le processus parent qui empêche la terminaison du processus parent lorsque sa fenêtre principale est fermée.

  • mort interrompt l'exécution du processus normal et les forces arrêter le plus tôt possible donc il est normal que les gestionnaires de fermeture ne sont pas exécutés

EDIT:

Pour le test créer application WPF et mettre le code suivant dedans:

public MainWindow() { 
     InitializeComponent(); 
     Loaded += MainWindow_Loaded; 
     Closed += MainWindow_Closed; 
    } 

    private Process process; 

    private void MainWindow_Closed(object sender, EventArgs e) { 
     // Log("WpfApp3.log", $"{DateTime.Now} Closed"); 
    } 

    private void MainWindow_Loaded(object sender, RoutedEventArgs e) { 
     // Log("WpfApplication3.log", $"{DateTime.Now} Loaded"); 
     process = new Process { 
      StartInfo = { 
       UseShellExecute = false, 
       // FileName = @"..\..\WpfApp2\bin\Debug\WpfApp2.exe", 
       FileName = @"..\..\CnslApp1\bin\Debug\CnslApp1.exe", 
       // FileName = @"..\..\WnFrmApp2\bin\Debug\WnFrmApp2.exe", 
       CreateNoWindow = true 
      } 
     }; 
     process.Start(); 
     var result = process.CloseMainWindow(); 
     if (result) { 
      ... 
     } 
    } 

Ensuite, créez trois nouveaux projets; un pour chaque Console/Windows Forms/WPF. et entrez le chemin correct vers l'exécutable dans le paramètre 'FileName' du StartInfo. Ensuite, vous pouvez jouer avec des paramètres pour voir comment chacun va se comporter.

Dans mon cas, process.CloseMainWindow() n'a eu aucun effet tant qu'il n'a pas été déplacé dans une autre méthode car le processus n'a pas encore été démarré. Mais une fois déplacé dans un gestionnaire de boutons et exécuté, il mettra fin aux trois types (un peut être utilisé à la fois avec cet exemple).

La seule exception était l'application Console lorsque la fenêtre était masquée.

+0

Tout effacer sauf le deuxième point. Si je génère un processus, je ne comprends pas pourquoi Process.CloseMainWindow ne devrait pas fonctionner. N'est-ce pas comme appuyer sur le bouton x? –

+0

@Alex, méthode CloseMainWindow ferme la 'fenêtre principale' des applications WindowsForm et WPF mais pas de ConsoleApp, car CreateNoWindow a la valeur true. Seule la raison (à côté du paramètre pointé) pour qu'une application ne se ferme pas sera un thread d'arrière-plan qui est toujours actif. Vous faites quelque chose en arrière-plan qui empêche la fermeture de l'application. – recineshto

+0

@Alex, quelle fenêtre vous fermez avec 'CloseMainWindow' (fenêtre de processus parent ou enfant)? – recineshto