1

[STAThread]C#で 実行されているプログラムがあります。

プログラムは定期的にクラスXのインスタンスを作成し、それらをリストに追加します。
一定期間が経過すると、これらのXのインスタンスが実行する必要のあるタスクが完了し、クラスのインスタンスは不要になります。
私はシングルスレッドで実行しており、これらのXのインスタンスの多くは同時に実行され、不要になったとしてもリソースを消費する可能性があるため、Xのインスタンスが完了したことがわかったらリソースを解放したいと思います。 、私のプログラムが遅くならないように。

私のコードは次のようになります:

 public partial class Form1 : Form
 {
    List<X> myList = new List<X>();

    ...
 }

私は疑問に思っています:

  1. 操作myList.RemoveAt(0)を実行すると、クラスXの最初のインスタンスのすべてのトレースがメモリから削除されます。
  2. これを行うためのより良い方法がある場合。

ありがとう!クリス

4

2 に答える 2

2

リストからクラスを削除しても、メモリ番号からすべてのトレースが削除されるわけではありません。C# は、ガベージ コレクターを備えたマネージ言語です。特定のオブジェクトが「アクティブ」と見なされる場所から参照されなくなった場合 (つまり、何らかの形で参照にコードでアクセスできることを意味します)、ガベージ コレクションの対象となります。これは単に、将来の不確定な時点で、GC がそのオブジェクトのメモリを自由にクリアできることを意味します。それはすぐかもしれませんし、長い時間かもしれません。幸いなことに、これについて心配する必要はほとんどありません。大量のメモリを消費するオブジェクトの参照が不要になったときに保持していないことを確認する必要があるだけです。

あなたの場合、あなたはあまり多くの詳細を与えていません。クラス X について何も知らなくても、それほど多くのメモリを消費せず、おそらくリストがそれほど大きくない可能性が高いと思います。それを考えると、これが何日もかかる長時間のタスクではない限り、解放されずに必要以上に長く実行されても、おそらく大したことではありません。

これらのオブジェクトが大量のメモリを消費している場合 (大規模なデータベース クエリの結果、大規模なファイルの内容などが含まれている場合) では、そもそもなぜリストを持っているのでしょうか? タイプのリストを作成し、それがバックグラウンド スレッドで使用されていることを示します。そのリスト全体がバックグラウンド スレッドに渡されますか? 特定のアイテムだけ?バックグラウンド スレッドに渡されている場合は、メイン スレッドで参照する必要がまったくない可能性があります (確実に言うには、より多くのコードを表示する必要があります)。

于 2012-09-10T13:59:37.327 に答える
0

いいえ、myList.RemoveAt(0);リストからオブジェクトへの参照のみを削除します。しかし、ガベージ コレクター (GC) は、オブジェクトへの参照がなくなったため、完全なオブジェクトを削除します。

アンマネージ メモリを使用しない場合は、GC を信頼してください。GC がいつオブジェクトを正確に削除するかはわかりませんが、問題ありません。そのままにしておいてください。

クラス X でアンマネージ メモリ (COM オブジェクト、ファイル ハンドルなど、本質的に Dispose() メソッドを持つもの) を使用している場合、オブジェクトへの参照を削除するだけでは不十分です。この場合、クラス X に IDisposable インターフェイスを実装し、X で使用するオブジェクトの Dispose メソッドを呼び出す Dispose メソッドを記述します。次に、コードを次のように変更します。

myList[0].Dispose();
myList.RemoveAt(0);
于 2012-09-10T14:01:10.700 に答える