Обработка ограничения памяти для процесса в C # - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть основное приложение, вызывающее другое консольное приложение через компонент Process. Я установил ограничение памяти в консольном приложении, используя настраиваемую реализацию объектов Job (имя класса в коде - «Job»)

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

Как это исправить?

Не удалось обработать глобальное исключение в консольном приложении.

Основное приложение имеет следующий код

private void startProcess()
    {
        try
        {                              
            Process proc = new Process();
            proc.StartInfo.FileName = @"E:\App\console.exe";            
            proc.StartInfo.CreateNoWindow = true;
            proc.StartInfo.RedirectStandardError = true;
            proc.StartInfo.RedirectStandardOutput = true;
            proc.StartInfo.UseShellExecute = false;
            proc.OutputDataReceived += Proc_OutputDataReceived;
            proc.ErrorDataReceived += Proc_ErrorDataReceived;
            proc.BeginOutputReadLine();
            proc.BeginErrorReadLine();
            proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            proc.Start();              
            Job job = new Job(_maxmemory);//memory limit set for child process
            job.AddProcess(proc.Id);//for the above console
            proc.WaitForExit();//this is called on a thread.         

        }
        catch (Exception ex)
        {
        }
    }

Консольное приложение имеет следующий код

static void Main(string[] args)
  {
            System.AppDomain.CurrentDomain.UnhandledException += CatchUnhandledException;
  }
static void CatchUnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            Console.Error.WriteLine(e.ExceptionObject.ToString());

        }

Как обработать это исключение ограничения памяти в основном приложении или на консоли?

1 Ответ

0 голосов
/ 04 ноября 2019

Ваш основной код приложения явно не поймает эту ошибку. Process.Start() запускает другой процесс асинхронно, поэтому метод завершится до того, как другой процесс действительно что-то сделает. Вам нужно будет позвонить proc.WaitForExit(), если вы хотите дождаться завершения дочернего процесса. После этого вы можете использовать свойство ExitCode, чтобы узнать, произошла ли ошибка в вашем дочернем процессе. Значение будет ненулевым, если ваш процесс умер из-за исключения.

Код, подобный этому, в процессе child должен действительно работать:

static void Main(string[] args)
{
    try 
    {
        AllocateALotOfMemory();
    }
    catch (OutOfMemoryException e)
    {
        // Handle error
    }
}
...