OutOfMemoryExceptionを避ける
.NET2.0では新規にMemoryFailPointというクラスが用意されたようです。OutOfMemoryExceptionはメモリが不足したら発生しますが、MemoryFailPointクラスを使うと事前に確保可能かチェックすることが出来ます。
簡単な使用例。
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime;
class Foo
{
public const int SizeMB = 1 * 1024;
byte bytes;
public Foo()
{
bytes = new byte[SizeMB * 1024 * 1024]; // 1GB;
}
}
class Program
{
static void Main(string args)
{
MemoryFailPoint mfp = null;
try
{
// 指定したメモリが使用可能がチェックする
// 使用出来ないようならInsufficientMemoryException例外
mfp = new MemoryFailPoint(Foo.SizeMB);
Foo f1 = new Foo();
/*
Foo f2 = new Foo();
Foo f3 = new Foo();
Foo f4 = new Foo();
*/
}
catch (InsufficientMemoryException e)
{
Console.WriteLine(e.Message);
}
catch (OutOfMemoryException e)
{
Console.WriteLine(e.Message);
}
finally
{
if (mfp != null)
mfp.Dispose();
}
}
}
事前チェックに引っ掛かるとInsufficientMemoryExceptionが発生します。結局、例外が発生するのでOutOfMemoryExceptionと変わらないような気がするかも知れませんが、一連の処理の途中でOutOfMemoryExceptionが発生してすると整合性を取るための後処理が必要になるので、事前にメモリ不足になることが分かることが必要なケースもあります。