У меня есть 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++;
}
}