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

C# 在C语言中处理进程的内存限制#,c#,process,memory-limit,C#,Process,Memory Limit,我有一个主应用程序通过流程组件调用另一个控制台应用程序。我通过作业对象的自定义实现在控制台应用程序上设置了内存限制(代码中的类名为“作业”) 每当超过内存限制时,就会抛出OutofMemory异常或发生KERNELBASE.DLL错误。但我无法在主应用程序或控制台应用程序中捕获此异常 处理这个问题的方法是什么 通过控制台应用程序中的全局异常进行处理无效 主应用程序有以下代码 private void startProcess() { try {

我有一个主应用程序通过流程组件调用另一个控制台应用程序。我通过作业对象的自定义实现在控制台应用程序上设置了内存限制(代码中的类名为“作业”)

每当超过内存限制时,就会抛出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());

        }

控制台应用程序有以下代码

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());

        }


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

您的主应用程序代码显然不会捕获该错误
Process.Start()。如果要等待子进程终止,则必须调用
proc.WaitForExit()
。之后,您可以使用
ExitCode
属性来确定您的子进程是否有错误。如果进程因异常而死亡,则该值将非零

子进程中的此类代码实际上应该可以工作:

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

这是
作业
a类.NET类型吗?我在.NET framework中找不到与您打算在那里执行的行为相匹配的同名类。@PMF
c#Job
它是作业对象的自定义实现,需要最大内存限制才能用于子进程。以前从未见过它们,这就是您所说的吗@ScottChamberlain是的,您共享的链接。子进程的内存分配在主应用程序中进行,而不是在子进程中。在这种情况下,catch块能否处理OutOfMemoryException?我从未见过或使用过此作业api,但我认为内存不是由主应用程序分配的,即使在这种情况下也是如此。作业只是设置了操作系统将强制执行的一些限制。你到底想干什么?为什么必须限制子进程的内存使用(而不是首先检查它们是否使用了太多内存)?我觉得你的方法很复杂。