0

が呼び出されたときの汎用コレクションのNotSupportedException最初のこと:これはコンパクトなフレームワーク3.5アプリケーションです。ガベージコレクタコールclear()(CF 3.5)

私は非常に奇妙な問題があります。 Dispose-Methodでは、アプリケーションはコレクション内のアイテムを破棄した後、リストをクリアします。これまで特別なことは何もなく、私のアプリケーションでDisposeが呼び出されたときのように機能します。しかし、Garbage CollectorがFinalizerを呼び出すと、同じDispose-Methodを呼び出すと、システムはGeneric CollectionのClear-MethodでNotSupported-Exceptionをスローします。ここで

は、廃棄・メソッドの本体である:

public override void Dispose() 
{ 
    if (items != null) 
    { 
     foreach (Shape item in items) 
     { 
      item.Dispose(); 
     } 
     items.Clear(); 
     items = null; 
    } 
    base.Dispose(); 
} 

私はここで完全にこだわっています。多分誰かがこれを私に説明することができる、あるいは同様の問題を抱えてそれを解決するかもしれない。

+0

なぜファイナライザは、廃棄パラメータなしを呼んでいますか? (1)もう一方のオブジェクトのDisposeメソッドが、スレッドを終了するコンテキストで有効に機能し、(2)他のオブジェクトが適切に扱われないことが分かっている場合を除いて、別のオブジェクトを廃棄することは非常にまれですそれ自体を完成させる。コード例の中には、それらの条件の1つでも満たされていることは示唆されていません。 – supercat

答えて

0

ファイナライザは、クリーンアップする管理対象外のリソースがある場合にのみ、Disposeを呼び出す必要があります。ファイナライザから呼び出されると、管理対象リソースにアクセスすることはできません。

上記のように、あなたのクラスでファイナライザを実装する必要はありません。

参考のために、あなたは次のように使用するファイナライザ、廃棄パターンを使用する必要がある必要があります。

// The finalizer 
~MyClass() 
{ 
    Dispose(false); 
} 

// The IDisposable implemenation 
public void Dispose() 
{ 
    Dispose(true); 
    GC.SuppressFinalize(this); 
} 

// The "real" dispose method 
protected virtual void Dispose(bool disposing) 
{ 
    if (!_disposed) 
    { 
     if (disposing) 
     { 
      // Dispose managed objects here 
     } 
     else 
     { 
      // Free unmanaged resources here 
     } 
     _disposed = true; 
    } 
}