捕获 OutOfMemory 异常 C#

Catching an OutOfMemory Exception 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 异常。

所以我一直在努力做的是:

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 异常。有更好的方法吗?

您可能需要重新设计 该算法,使其不会尝试将 "everything" 放入队列中...或者,也许, 根本不使用队列。例如,这里可以使用 iterator 吗?

LongMethod 的逻辑,目前表示为双嵌套循环,可以 等效地表示为一种算法(给定 struct 在调用之间 "hold state"),returns(或 "yields")每次一个新的 object()

该算法的重新表达将使您免于生成大量对象 "all at once," 并将它们放入队列中的义务 "all at once." 相反,它可能会生成对象一次 "on demand," and/or 生成和排队 "some" 个对象,同时保留在将来某个时间生成 "more of them" 的能力。

你真的不能 "catch" 一个 OOM 异常:当这样的事情发生时,"the program is already nine-tenths dead in the water, and almost certain to quickly finish drowning."你需要某种算法重新设计来消除 "such a massive 'queue.'"