ちょっとあんまりじゃないかい!なMemoryFailPoint
ファイルを一時的にバッファに詰めていろいろ処理するとこでOutOfMemoryExceptionが発生するっつーんで、先もってそのバッファが確保できるかを調査するためにMemoryFailPointを使ってみたわけですよ。
MemoryFailPoint クラスのインスタンスを作成すると、メモリ ゲートが作成されます。メモリ ゲートとは、大量のメモリを必要とするアクティビティを開始する前に、十分なリソースがあるかどうかをチェックすることです。チェックに合格しなかった場合、操作を開始できないようにする InsufficientMemoryException がスローされるため、リソース不足が原因となってアプリケーションが実行中に失敗する可能性が減少します。これにより、アプリケーションでは、パフォーマンスを低下させ、OutOfMemoryException や、コード内の任意の場所で OutOfMemoryException を誤って処理したことが原因で発生する状態の破損を避けることができます。
InsufficientMemoryException をスローすることにより、操作を完了できそうにないという回復可能である予測と、部分的に完了済みの操作で発生した、状態破損の可能性のある OutOfMemoryException とをアプリケーションで識別できます。これにより、アプリケーションは、現在の AppDomain のアンロードやプロセスのリサイクルが必要となる可能性のあるペシミスティック発生ポリシーの頻度を減らすことができます。
MemoryFailPoint は、すべてのガベージ コレクション ヒープで十分なメモリと連続した仮想アドレス空間が利用できるかどうかをチェックし、必要に応じてスワップ ファイルのサイズを大きくします。MemoryFailPoint は、ゲートの有効期間中にメモリが長期にわたって使用できるかどうかについては保証しませんが、呼び出し元は常に Dispose を呼び出して、MemoryFailPoint に関連付けられたリソースを解放する必要があります。
メモリ ゲートを使用するには、操作で使用が想定されるメモリのメガバイト数を指定して、MemoryFailPoint オブジェクトを作成する必要があります。十分なメモリを使用できない場合は、InsufficientMemoryException が発生します。
コンストラクタのパラメータは正の整数である必要があります。負の値であると、ArgumentOutOfRangeException が発生します。
ということで
テストコード
private void test() { check(-1); check(0); check(1); } private void check(int sizeMB) { MemoryFailPoint mfp = null ; try { mfp = new MemoryFailPoint(sizeMB); Console.WriteLine(sizeMB + " ok"); } catch (Exception err) { Console.WriteLine(sizeMB + " " + err.Message); } finally{ if (mfp!=null) mfp.Dispose(); } }
出力結果:
-1 負の値ではない数値が必要です。 パラメータ名: sizeInMegabytes 0 負の値ではない数値が必要です。 パラメータ名: sizeInMegabytes 1 ok
0 負の値ではない数値が必要です。
工工エェ(´Д`)ェエ工
ヒープが確保できるか確認するのに0じゃ意味がないじゃんてのはわかるんだけど、エラーメッセージもMSDNの記述もおかしくね?