Задача: Автоматическое удаление всех дочерних процессов, если родительский процесс завершается. Родительские методы могут быть прекращены не только правильным способом, но и убийством в ProcessExplorer, например. Как я могу это сделать?Как завершать дочерние процессы при завершении родительского процесса в C#
Подобный вопрос в С topic совет использовать объекты работы. Как использовать его в C# без экспорта внешней DLL?
Я попытался использовать объекты задания. Но этот код не работает должным образом:
var job = PInvoke.CreateJobObject(null, null);
var jobli = new PInvoke.JOBOBJECT_BASIC_LIMIT_INFORMATION();
jobli.LimitFlags = PInvoke.LimitFlags.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
| PInvoke.LimitFlags.JOB_OBJECT_LIMIT_PRIORITY_CLASS
| PInvoke.LimitFlags.JOB_OBJECT_LIMIT_JOB_TIME
| PInvoke.LimitFlags.JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION
| PInvoke.LimitFlags.JOB_OBJECT_LIMIT_JOB_MEMORY;
var res = PInvoke.SetInformationJobObject(job, PInvoke.JOBOBJECTINFOCLASS.JobObjectBasicLimitInformation, jobli, 48);
if (!res)
{
int b = PInvoke.GetLastError();
Console.WriteLine("Error " + b);
}
var Prc = Process.Start(...);
PInvoke.AssignProcessToJobObject(job, Prc.Handle);
PInvoke.SetInformationJobObject возвращается с ошибкой. GetLastError возвращает ошибку 24. Однако PInvoke.AssignProcessToJobObject работает и дочерний процесс добавлен в Job Queue (я могу видеть его в ProcessExplorer). Но, поскольку PInvoke.SetInformationJobObject не работает, процесс, оставшийся в живых, остается в живых, когда я убиваю родителя.
В чем заключается неправильный код?
Другой ответ на вопрос, кажется, хорош для меня, просто вырвите функции из kernel32. http://www.pinvoke.net/default.aspx/kernel32.assignprocesstojobobject –