在C#中处理进程的内存限制

我有一个主应用程序,它通过Process组件调用另一个控制台应用程序。我已经通过自定义实现Job Objects(代码中类名为'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());

        }

如何在主应用程序或控制台中处理此内存限制异常?

hotdog33 回答:在C#中处理进程的内存限制

您的主要应用代码显然不会捕获该错误。 Process.Start()异步启动另一个进程,因此该方法将在另一个进程真正执行某操作之前结束。如果要等待子进程终止,则必须调用proc.WaitForExit()。之后,您可以使用ExitCode属性来确定您的子进程是否有错误。如果您的进程由于异常而死亡,则该值将为非零值。

像这样的代码在 child 流程中应该可以正常工作:

static void Main(string[] args)
{
    try 
    {
        AllocateALotOfMemory();
    }
    catch (OutOfMemoryException e)
    {
        // Handle error
    }
}
本文链接:https://www.f2er.com/3168580.html

大家都在问