Как спасти родительский процесс от фатальной ошибки в дочернем процессе

#c# #.net #windows #.net-core #process

Вопрос:

Моя цель-изолировать выполнение некоторого кода для NET Core.

  1. У меня есть консольное приложение № 1 (родительское?), которое запускает процесс для другого консольного приложения № 2 (дочернего?), которое, в свою очередь, запускает динамически скомпилированный код.
  2. Выполнение этого кода может привести к фатальной ошибке, например, исключению OutOfMemoryException.
  3. Когда это произойдет, приложение № 1 выйдет из строя вместе с приложением № 2.

Есть ли способ спасти приложение № 1 от сбоя приложения № 2?

Может быть, я что-то неправильно понимаю, но я думал, что они должны быть совершенно отдельными. Пожалуйста, помогите. Также буду признателен за решение для NET Framework, если таковое имеется.

         ProcessStartInfo processStartInfo = new ProcessStartInfo(filePath, processArgs)
        {
            UseShellExecute = false,
            RedirectStandardOutput = true,
            CreateNoWindow = true
        };

        using (Process process = new Process()
        {
            StartInfo = processStartInfo,
            EnableRaisingEvents = true
        })
        {
            process.Start();
            process.WaitForExit();

            return process.StandardOutput.ReadToEnd();
        };
 

Комментарии:

1. Что именно происходит в родительском процессе при сбое дочернего процесса? ФУ, я бы также ожидал, что они будут независимыми.

2. Как насчет попытки поймать исключение, вызванное потоком № 2 в потоке № 1?

3. @500-Ошибка внутреннего сервера, оба приложения разбиваются, и я получаю всплывающее окно Windows о сбое.

4. @T. Трасудейн, вы предлагаете запустить приложение № 2 из другого потока?

5. Что там написано?

Ответ №1:

Таким образом, достаточно завершить код дочернего приложения. Родительское приложение продолжает свою работу даже после OutOfMemoryException того, как, StackOverflowException , AccessViolationException в дочернем приложении.

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

Спасибо, ребята, что открыли глаза!