2

GC.WaitForPendingFinalizers()のMSDNドキュメントからの引用:

ファイナライザーが実行されるスレッドは指定されていないため、このメソッドが終了する保証はありません。

私はこの文を本当に理解していません。このメソッドはどのような状況で終了しませんか?そして、これはファイナライザーが実行されるスレッドと何の関係がありますか?なぜ彼らはスレッドが「指定されていない」と述べているのですか?

ファイナライザースレッドに関しては、次のことが正しいと思います(?):

  • ファイナライザースレッドは1つだけです。
  • ファイナライザーは常に別のスレッドで実行されます(つまり、メインスレッド、または他のユーザーが作成したスレッドでは実行されません)。

注:ファイナライザーの1つがブロックされると、このメソッドがブロックされることは想像できますが、この問題は、ファイナライザーに使用されているスレッドに関係なく存在します。

4

2 に答える 2

2

MSDNの別の記事から:

Finalizeメソッドは、次の例外的な状況では、完全に実行されないか、まったく実行されない可能性があります。

  • 別のファイナライザーは無期限にブロックします(無限ループに入り、取得できないロックを取得しようとします)。ランタイムはファイナライザーを最後まで実行しようとするため、ファイナライザーが無期限にブロックされた場合、他のファイナライザーが呼び出されない可能性があります。

  • プロセスは、ランタイムにクリーンアップする機会を与えずに終了します。この場合、ランタイムのプロセス終了の最初の通知はDLL_PROCESS_DETACH通知です。

于 2012-10-04T16:13:19.980 に答える
1

まず、おそらくSuppressFinalizeを除いて、通常はGCクラスのメソッドを使用する必要はありません。他のほとんどの方法では、通常、アプリケーションのパフォーマンスが最悪になりますが、良くなることはありません。

しかし、あなたの質問に答えるために、収集が実行されたときに私が知る限り、実行するファイナライザーのガベージコレクターによって保持される内部リストがあり、それらはすべて同じスレッドで順次実行されます。つまり、ファイナライザーが1つブロックされると、このメソッドもブロックされると思います。

アプリドメインがシャットダウンすると、すべてのファイナライザーが終了するまでの時間制限があります。その場合、それは実際には問題ではないと思います。

于 2012-10-04T16:10:21.767 に答える