2011-01-14 1 views
2

Ich habe eine Konsolenanwendung und in der Main-Methode. Ich starte einen Prozess wie der Code unten, wenn Prozess existiert, das Exist-Ereignis des Prozesses wird abgefeuert, aber es schloss auch meine Konsolenanwendung, ich möchte nur einen Prozess starten und dann in Exit-Ereignis dieses Prozesses einen anderen Prozess starten.Handle beenden Ereignis des untergeordneten Prozesses

Es ist auch verdrahtet, dass Prozessausgabe in meiner Hauptkonsolenanwendung widerspiegelt.


Process newCrawler = new Process(); 
newCrawler.StartInfo = new ProcessStartInfo(); 
newCrawler.StartInfo.FileName = configSection.CrawlerPath; 
newCrawler.EnableRaisingEvents = true; 
newCrawler.Exited += new EventHandler(newCrawler_Exited); 

newCrawler.StartInfo.Arguments = "someArg"; 
newCrawler.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
newCrawler.StartInfo.UseShellExecute = false; 
newCrawler.Start(); 

Antwort

1

Sie haben newCrawler.WaitForExit(), um zu rufen, bis das Kind Prozess beenden zu bleiben. Dann können Sie verwenden, um den Ausgangswert zu haben.

+0

Danke, aber ich muss das Exit-Ereignis verwenden, weil ich die Anwendung nicht blockieren will, bis der Prozess existiert – Ehsan

+0

Ok, aber wer hält den Hauptprozess (Ihre Konsolenanwendung) noch läuft? Sie sagen, dass es beendet wird ... –

+0

Ich habe ManualResetEvent verwendet, um zu verhindern, dass die Hauptkonsolenanwendung beendet wird. – Ehsan

1

Scheint so, als hätte die Prozess-Exit-Behandlung den Anwendungsfehler verursacht. Also könnte die Anwendung beendet sein. Kannst du einen richtigen Versuch machen..catch block und debugg um zu sehen, was schief läuft. Oder kommentieren Sie die Linie

newCrawler.Exited += new EventHandler(newCrawler_Exited); 

and see what happens. 

Bitte versuchen Sie folgenden Code (Dies ist von MSDN), auch nicht vergessen, ein Argument übergeben (Filename)

using System; 
using System.Diagnostics; 
using System.ComponentModel; 
using System.Threading; 
using Microsoft.VisualBasic; 

class PrintProcessClass 
{ 

    private Process myProcess = new Process(); 
    private int elapsedTime; 
    private bool eventHandled; 

    // Print a file with any known extension. 
    public void PrintDoc(string fileName) 
    { 

     elapsedTime = 0; 
     eventHandled = false; 

     try 
     { 
      // Start a process to print a file and raise an event when done. 
      myProcess.StartInfo.FileName = fileName; 
      myProcess.StartInfo.Verb = "Print"; 
      myProcess.StartInfo.CreateNoWindow = true; 
      myProcess.EnableRaisingEvents = true; 
      myProcess.Exited += new EventHandler(myProcess_Exited); 
      myProcess.Start(); 

     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("An error occurred trying to print \"{0}\":" + "\n" + ex.Message, fileName); 
      return; 
     } 

     // Wait for Exited event, but not more than 30 seconds. 
     const int SLEEP_AMOUNT = 100; 
     while (!eventHandled) 
     { 
      elapsedTime += SLEEP_AMOUNT; 
      if (elapsedTime > 30000) 
      { 
       break; 
      } 
      Thread.Sleep(SLEEP_AMOUNT); 
     } 
    } 

    // Handle Exited event and display process information. 
    private void myProcess_Exited(object sender, System.EventArgs e) 
    { 

     eventHandled = true; 
     Console.WriteLine("Exit time: {0}\r\n" + 
      "Exit code: {1}\r\nElapsed time: {2}", myProcess.ExitTime, myProcess.ExitCode, elapsedTime); 
    } 

    public static void Main(string[] args) 
    { 

     // Verify that an argument has been entered. 
     if (args.Length <= 0) 
     { 
      Console.WriteLine("Enter a file name."); 
      return; 
     } 

     // Create the process and print the document. 
     PrintProcessClass myPrintProcess = new PrintProcessClass(); 
     myPrintProcess.PrintDoc(args[0]); 
    } 
} 

Eine Sache, die ich bemerkt, wenn Sie Übergeben Sie den Dateinamen nicht als Parameter, das führt zum Absturz des Prozesses, aber die Anwendung ist intakt (Da die Ausnahme innerhalb des Prozesses behandelt wird).

Wenn Sie den Dateinamen nicht übergeben, stürzt der obige Code ab, weil myPrintProcess.PrintDoc (args [0]); löst Ausnahme vom Hauptprozess selbst aus. Ich habe versucht, ein Extintin in der Exit-Handler zu erstellen, zu dem Zeitpunkt auch die Anwendung (Hauptprozess) abgestürzt.

können Sie versuchen, den Code im Exit-Handler zu kommentieren?

+0

Ich schreibe nur Environment.Exit (0) in den Prozess zum Testen, aber es funktioniert immer noch nicht, Exit-Ereignis des Prozesses wird mit ExitCode = 0 gefeuert, was bedeutet, dass keine Ausnahme im Prozess aufgetreten ist, aber warum es das Haupt schließt Konsolenanwendung ? – Ehsan

+0

wooow im so tut mir leid, das Ausführen der ersten Zeile des Codes im Exit-Ereignis löst eine Ausnahme aus und schließen Sie das Programm, aber ich wundere mich immer noch, warum es die Konsolenanwendung beendet, weil es in einem separaten Thread mit ThreadPool ausgeführt wird – Ehsan