これは私が確かめるためだけに、私はこの権利を持っています:IDisposable with destructor:スレッドセーフ実装が必要ですか?
私たちはIDisposalパターンを実装する大きなリソースクラスを持っています。それは、(たとえ正確に1回だけ呼び出しても)1回以上呼び出されるように(意図的に)実装されるべきです。また、Dispose()メソッドを呼び出すFinalizerも実装しています。手動で呼び出すと、Dispose()はGC.SuppressFinalize(this)も呼び出します。
処分パターンのいくつかの例があります。彼らのほとんどは、処理コードのエンドでGC.SuppressFinalize(this)と呼んでいます。 Dispose()メソッドの初めにの前に呼び出すことをお勧めします。の前にクリーニングしてください。後者は、GCがファイナライザを同時に呼び出していないことを確認します。
質問:
GC.SuppressFinalizeを最初に置いているようですが、これ以上はありませんか?我々はまだ競争状態を持っていますよね?だから、代わりにスレッドセーフな方法でDispose()を実装する必要があります。
.NET Frameworkのフレームワーク設計ガイドラインで説明されているように、disposeパターンは最後に 'GC.SuppressFinalize'コールを持っています。このガイドラインはマイクロソフト社内で大きく議論されており、最終的にパターンはこのように終わった。 – Steven