3

私は C# プログラミングの初心者であり、GC の概念と、IDisposable に対するその関係はまだ少し曖昧です。ガベージ コレクションに関して、Dispose を呼び出すとはどういう意味ですか? 具体的には、ガベージ コレクションが開始されるタイミングによっては、次のコードが時折失敗する可能性があるのではないかと思います (テスト中にクラッシュさせることはできませんでした)。

//List<TestClass2> tc2List;
//TestClass2 invokes a thread. It implements IDisposable. 
//Its Dispose() sets a stop-condition for the thread,
//and joins the thread, awaiting it to stop. (may take 100 msek)

tc2List.RemoveAll(t =>
{
  if (String.Compare(t.Name, "Orange") == 0)
  {
    t.Dispose(); //May take up to 100 msek
    return true;
  }
  return false;
});
4

4 に答える 4

4

コードは機能しますが、スタイルが悪いです。述語に副作用があってはなりません。したがって、最初に要素を破棄してから削除する必要があります。

Predicate<T> filter = t => t.Name == "Orange";
foreach(var t in tc2List.Where(filter))
  t.Dispose();
tc2List.RemoveAll(filter);
于 2013-01-25T10:28:28.280 に答える
2

i wonder if the following code may fail occationally, depending on when the garbage collection kicks in

No, it won't fail

//Its Dispose() sets a stop-condition for the thread,
//and joins the thread, awaiting it to stop. (may take 100 msek)

That is a slightly a-typical use of Dispose() but not wrong. A more efficient approach would use a different Stop() so that you can stop all threads at once. Or call Dispose() from Parallel.ForEach(). But whatever method you choose, it is not hindering, nor is it being hindered by, the GC.

于 2013-01-25T10:17:19.133 に答える
1

ファイナライズメソッドはありますTestClass2か?

主なプロパティを破棄します

  1. これは、IDisposeインターフェースを実装するクラスで実装する必要があります。
  2. ファイル、ハンドル、接続などの管理されていないリソースを解放するのに適した場所です。
  3. Dispose()メソッドは、コード自体で明示的に呼び出されます。
  4. Dispose()メソッドは、「使用中」で使用されると、自動的に呼び出されます(IDisposeを実装するオブジェクトの場合)。

リンクを参照してください。

于 2013-01-25T10:22:10.887 に答える
0

ガベージ コレクションに関して、Dispose を呼び出すとはどういう意味ですか?

dispose を呼び出すということは、Dispose メソッドの実装を使用して、物事 (文字通りメモリ) を強制的にクリーンアップしていることを意味します。注 : (一部のフレームワーク クラスは、Dispose の実装を呼び出します。たとえば、System.Windows.Forms.Form)

対照的に、ガベージ コレクションは .NET ランタイムの機能であり、自動的にクリーンアップします。つまり、ランタイムによって処理されるメモリの負荷やその他の要因に依存するためです。

私がお勧めする簡単な戦略。メモリが必要以上に長く残り、アプリケーションに影響を与えると思われる場合は、Dispose() を実行してください。それ以外の場合は、ランタイムに任せます。オブジェクトがスコープ外になると、オブジェクトが自動的にクリーンアップ (つまりファイナライズ) されます。GC には、クリーンアップを行う方法に関する独自のアルゴリズムがありますが、より多くの場合、それに頼ることができます。

次の質問具体的には、ガベージ コレクションがいつ開始されるかによって、次のコードが時々失敗する可能性があるのだろうか

いいえ。GC の開始によるコードの失敗は、TestClass2 のファイナライザーの記述方法によって異なります。間違いなく、呼び出し t.Dispose() は GC と衝突しません。

于 2013-01-25T10:38:58.140 に答える