C# 在C语言中处理进程的内存限制#
我有一个主应用程序通过流程组件调用另一个控制台应用程序。我通过作业对象的自定义实现在控制台应用程序上设置了内存限制(代码中的类名为“作业”) 每当超过内存限制时,就会抛出OutofMemory异常或发生KERNELBASE.DLL错误。但我无法在主应用程序或控制台应用程序中捕获此异常 处理这个问题的方法是什么 通过控制台应用程序中的全局异常进行处理无效 主应用程序有以下代码C# 在C语言中处理进程的内存限制#,c#,process,memory-limit,C#,Process,Memory Limit,我有一个主应用程序通过流程组件调用另一个控制台应用程序。我通过作业对象的自定义实现在控制台应用程序上设置了内存限制(代码中的类名为“作业”) 每当超过内存限制时,就会抛出OutofMemory异常或发生KERNELBASE.DLL错误。但我无法在主应用程序或控制台应用程序中捕获此异常 处理这个问题的方法是什么 通过控制台应用程序中的全局异常进行处理无效 主应用程序有以下代码 private void startProcess() { try {
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中找不到与您打算在那里执行的行为相匹配的同名类。@PMFc#Job
它是作业对象的自定义实现,需要最大内存限制才能用于子进程。以前从未见过它们,这就是您所说的吗@ScottChamberlain是的,您共享的链接。子进程的内存分配在主应用程序中进行,而不是在子进程中。在这种情况下,catch块能否处理OutOfMemoryException?我从未见过或使用过此作业api,但我认为内存不是由主应用程序分配的,即使在这种情况下也是如此。作业只是设置了操作系统将强制执行的一些限制。你到底想干什么?为什么必须限制子进程的内存使用(而不是首先检查它们是否使用了太多内存)?我觉得你的方法很复杂。