私は DataGridView にデータ バインド オブジェクトを介して定期的に値を設定していますが、「ログ サイクル」中に行数が数千になる可能性があります。
新しい「ログ サイクル」が始まると、基になるデータ ソースがクリアされ、プロセスが再び開始されるため、グリッドがクリアされます。
これで問題ありませんが、前回の実行には時間がかかるため、以前の行はすべて第 2 世代のオブジェクトになり、完全な GC でガベージ コレクションのみが行われました。
ただし、最初の GC はそれらすべてをファイナライザー キューに送信するため、それらをクリアするには 2 回のフル GC が必要です。これは、2 倍の長さのメモリを占有することを意味します。
リフレクターを使用すると、DataGridViewRow にはファイナライザー メソッドがないことがわかりますが、DataGridViewBand オブジェクトから継承されます。これは、パブリック Dispose() メソッドを介して GC.SuppressFinalize(this) を呼び出します。
私の質問は、なぜ私の DataGridViewRows が最初のフル GC で収集されず、別の GC を待っているファイナライザー キューに入れられないのですか?
(ここでの私の仮定は、ファイナライザーのないオブジェクトはファイナライザー キューに配置されるべきではなく、ファイナライザーを持っているが GC.SuppressFinalize を呼び出すオブジェクトもキューに配置されないということです。この仮定は正しいですか?)
ありがとう。