捕获OutOfMemory异常C#

莫阿拉兹

希望有人可以帮助我,我没有想法!

我有一个密集的方法来创建对象并将其放入队列。看起来很像:

private void LongMethod()
  {
     for (int i=0; i<number;i++)
    {
        for (int j=0; j<number; j++)
        {
         object o = new object();
         queue.enqueue(o);
        }
    }
  }

但是,有时number值非常大,因此,根据可用的内存量,有时会抛出OutOfMemory Exception。

所以我一直想做的是这样的:

private bool CheckingMethod(number)
{
long initialValue =   System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64;

object o = new object();
queue.Enqueue(o)

long difference = initialValue - System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64;

if(Microsoft.VisualBasic.Devices.ComputerInfo.TotalPhysicalMemory <= difference * number * number)
    {
     return true;
    }
    return false;
}

然后,调用方法可以执行以下操作:

private void CallingMethod(number)
    {
     if(CheckingMethod(number)
      {
       LongMethod(number);
      }
    }

我试图在运行longMethod之前检查它是否会导致OOM异常。我的问题是,difference这将给我一个截然不同的值,因此有时我仍然会遇到outOfMemory异常。有一个更好的方法吗?

迈克·罗宾逊

很有可能您需要重新设计该算法,以便它不会尝试将“所有内容”放入队列中……或者根本不使用队列。例如,可以在此处使用迭代器吗?

的逻辑LongMethod(目前表示为双嵌套循环)可以等效地表示为一种算法(赋予struct某种类型以使其在调用之间处于“保持状态”),每次都返回(或“产生”)新的算法object()

重新表达该算法将使您免于“一次全部”生成大量对象并将它们“一次全部”放入队列的义务。取而代之的是,有可能一次“按需”生产对象,和/或生产和排队“某些”对象,同时保留在将来某个时间生产“更多”对象的能力。

您真的不能“捕获” OOM异常:当发生这种情况时,“该程序已经死了十分之九,几乎可以肯定会很快淹死。” 您需要某种算法的重新设计,以消除对“如此庞大的'队列'”的需求。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C#异常OutOfMemory

来自分类Dev

C#等待并捕获异常

来自分类Dev

从HttpClient.GetAsync()捕获OutOfMemory异常

来自分类Dev

线程退出与未捕获的异常android(OutOfMemory)

来自分类Dev

C#如何捕获异常并恢复执行

来自分类Dev

C#通过消息捕获异常

来自分类Dev

未捕获MySQL异常(C#)

来自分类Dev

未捕获MySQL异常(C#)

来自分类Dev

C#用户定义的异常未捕获

来自分类Dev

无法捕获 c# web api 异常

来自分类Dev

C#捕获异常或预先验证参数

来自分类Dev

C#使用反射来捕获异常抛出

来自分类Dev

捕获C#中从Delphi DLL引发的异常

来自分类Dev

C#在调用堆栈中捕获未处理的异常

来自分类Dev

C#从委托.begininvoke捕获异常而不调用委托.endinvoke

来自分类Dev

如何停止捕获C#中的特定异常

来自分类Dev

是否可以捕获基本FaultException并检索原始异常?C#

来自分类Dev

C#在调用堆栈中捕获未处理的异常

来自分类Dev

捕获对象在代码之前抛出的异常... c#

来自分类Dev

无法在 try-catch C# 中捕获异常

来自分类Dev

C# 不会捕获“嵌套”自定义异常

来自分类Dev

C#中通过继承捕获异常

来自分类Dev

无法捕获C ++异常

来自分类Dev

表的OutOfMemory异常

来自分类Dev

获取OutOfMemory异常线程

来自分类Dev

在ASP.NET C#中捕获所有异常,而不是在try {} catch {}块中捕获每个方法

来自分类Dev

在ASP.NET C#中捕获所有异常,而不是在try {} catch {}块中捕获每个方法

来自分类Dev

在WebAPI C#中的请求反序列化期间捕获异常

来自分类Dev

我们可以在C#的基类中捕获子类方法的异常吗?