обрабатывать событие выхода дочернего процесса - PullRequest
2 голосов
/ 14 января 2011

У меня есть консольное приложение и в методе Main. Я запускаю процесс, подобный приведенному ниже, когда процесс существует, событие Exist этого процесса запускается, но оно также закрывает мое консольное приложение, я просто хочу запустить процесс, а затем при выходе из этого процесса запустить другой процесс.

Также установлено, что вывод процесса отображается в моем главном консольном приложении.


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();

Ответы [ 2 ]

1 голос
/ 14 января 2011

Похоже, что обработка завершения процесса могла вызвать ошибку приложения. Таким образом, приложение могло быть прекращено. Можете ли вы поставить правильный блок try..catch и отладку, чтобы увидеть, что происходит не так. Или прокомментируйте линия

newCrawler.Exited += new EventHandler(newCrawler_Exited);  

and see what happens.

Пожалуйста, попробуйте следующий код (это из MSDN), также не забудьте передать один аргумент (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]);
    }
}

Одна вещь, которую я заметил, это то, что если вы не передадите имя файла в качестве параметра, это приведет к сбою процесса, но приложение все еще не повреждено (поскольку исключение обрабатывается внутри процесса).

Если вы не передадите имя файла, приведенный выше код завершится сбоем из-за myPrintProcess.PrintDoc (арг [0]); выбросит исключение из самого основного процесса. Я пытался создать исключение в обработчике выхода, в то время приложение (основной процесс) также зависало.

Вы можете попробовать комментировать код в обработчике выхода?

1 голос
/ 14 января 2011

Вы должны позвонить newCrawler.WaitForExit(), чтобы остаться до завершения дочернего процесса.Затем вы можете использовать newCrawler.ExitCode, чтобы получить значение выхода.

...