Как вернуть элемент управления сразу после сбоя parent.exe? - PullRequest
0 голосов
/ 31 августа 2018

У меня есть 3 процесса (дед, родитель и ребенок). Grandparent - это процесс-демон, который вызывает Parent.exe, а inturn вызывает Child.exe. Когда я убиваю Parent.exe из диспетчера задач, Child.exe продолжает существовать, и дед не сразу получает управление. Дедушка получает контроль только после того, как Child.exe завершит его выполнение.

Однако вместо того, чтобы вызывать Child.exe из Parent.exe, если я выполняю какую-либо другую работу, GrandParent получает управление сразу после того, как Parent.exe убивается из диспетчера задач.

Почему контроль не передается сразу в 1-м случае? Что я должен сделать, чтобы достичь этого?

Я пытался использовать Medallion.Shell и System.Diagonostics.Process.Process для вызова моих исполняемых файлов Parent и Child.


GrandParent

static void Main(string[] args)
{
    Console.WriteLine("Grand Parent Started");
    try
    {
        while (Console.ReadKey() != null)
        {
            var childExePath = @"Child.exe";
            var parentExePath = @"Parent.exe";
            var proc = new Process
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName = parentExePath,
                    Arguments = childExePath,
                    UseShellExecute = false,
                    RedirectStandardOutput = true,
                    CreateNoWindow = true,
                    RedirectStandardError = true
                }
            };
            proc.OutputDataReceived += (s, e) => Console.WriteLine(e.Data);
            proc.ErrorDataReceived += (s, e) => Console.WriteLine(e.Data);
            proc.Start();
            Console.WriteLine($"{DateTime.Now:O} Starting Parent.exe - {proc.Id}");
            proc.BeginOutputReadLine();
            proc.BeginErrorReadLine();
            proc.WaitForExit();
            Console.WriteLine($"{DateTime.Now:O} Stopping Parent.exe - {proc.Id}");
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"{DateTime.Now:O} Exception in GrandParent - {ex}");
    }
}

Родитель

static void Main(string[] args)
{
    try
    {
        Console.WriteLine($"{DateTime.Now:O} Parent Started");
        Task.Run(() =>
        {
            var proc = new Process
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName = args[0],
                    Arguments = "Parent",
                    UseShellExecute = false,
                    RedirectStandardOutput = true,
                    CreateNoWindow = true,
                    RedirectStandardError = true
                }
            };
            proc.Start();
            proc.OutputDataReceived += (s, e) => Console.WriteLine(e.Data);
            proc.ErrorDataReceived += (s, e) => Console.WriteLine(e.Data);
            Console.WriteLine($"{DateTime.Now:O} Starting Child.exe: {proc.Id.ToString()}");
            proc.BeginOutputReadLine();
            proc.BeginErrorReadLine();
            proc.WaitForExit();
            Console.WriteLine($"{DateTime.Now:O} Stopping Child.exe: {proc.Id.ToString()}");
        });
        Console.WriteLine($"{DateTime.Now:O} Parent Ended");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"{DateTime.Now:O} Execption caught in Parent - {ex.Message}");
        Console.ReadKey();
    }
}

Дети

static void Main(string[] args)
{
    var name = args != null && args.Length > 0 ? args[0] : "Test";
    int i = 0;
    while (i < 50)
    {
        var msg = string.Format("{0}::Hello World({2})-{1}", DateTime.Now.ToString("O"), name, i);
        Console.WriteLine(msg);
        Thread.Sleep(1000);
        i++;
    }
}
...