1

ImageListご想像のとおり、画像が表示されています。これらの画像は、データセットのメモリにとして読み込まれますBitmapImageList私がそれらをメモリの増加にロードするまで、心配する必要はありません。しかし、それらがImageListメモリ使用量のスカイロケットに追加されると。しかし、最大の問題は、画像のリストをリロードする必要がある場合です。リストのすべての画像でdisposeを呼び出そうとしましたが、メモリが解放されません。これは私がメモリをクリーンアップしようとしたコードです:

        foreach (Image item in imageList.Images)
        {
            item.Dispose();

        }
        imageList.Images.Clear();

        GC.Collect();

私は何が間違っているのですか?

4

1 に答える 1

5

あなたの破棄コードは適切ではありません。Images コレクションを反復処理すると、実際には各イメージの新しいビットマップが作成されます。その後、すぐに再び処分します。Clear() を呼び出すだけです。

GC.Collect() も効果がありません。ImageList クラスはネイティブ Windows コンポーネントのラッパーです。ガベージコレクションされたメモリではなく、ネイティブメモリに画像を保存します。

最後になりましたが、あなたの本当の問題: Windows メモリ マネージャーは、あなたが思っているようには機能しません。メモリを解放するときに、プログラムの仮想メモリ サイズは縮小されません。メモリのブロックを未使用としてマークし、空きブロックのリストに追加するだけです。後で再利用する準備ができています。解放されたメモリがたまたま予約済みメモリ ページのセット全体にまたがるという非常にまれなケースでのみ、仮想メモリ サイズを縮小できます。これは実際の問題ではありません。仮想です。

于 2010-10-12T14:31:00.187 に答える