2

引用GC.WaitForPendingFinalizers()的 MSDN 文档:

运行终结器的线程未指定,因此无法保证此方法会终止。

我真的不明白这句话。这个方法在什么情况下不会终止?这与终结器运行的线程有什么关系?为什么他们说线程是“未指定的”?

关于终结器线程,我假设以下是正确的(?):

  • 只有一个终结器线程。
  • 终结器总是在单独的线程上运行(即从不在主线程或任何其他用户创建的线程上)。

注意:我可以想象这个方法会在终结器之一阻塞时阻塞,但是无论终结器使用什么线程,这个问题都存在。

4

2 回答 2

2

来自MSDN 上的另一篇文章

在以下异常情况下,Finalize 方法可能不会运行完成或根本不会运行:

  • 另一个终结器无限期地阻塞(进入一个无限循环,试图获得一个它永远无法获得的锁,等等)。因为运行时会尝试运行终结器以完成,所以如果终结器无限期地阻塞,则可能不会调用其他终结器。

  • 该进程在没有给运行时清理机会的情况下终止。在这种情况下,运行时的第一个进程终止通知是 DLL_PROCESS_DETACH 通知。

于 2012-10-04T16:13:19.980 回答
1

首先,你通常不需要在 GC 类中使用方法,可能除了 SuppressFinalize。大多数其他方法通常会使您的应用程序性能最差,而不是更好。

但是,为了回答你的问题,据我所知,当收集执行时,终结器的垃圾收集器持有一个内部列表来运行,它们都在同一个线程上按顺序运行。这意味着,如果一个终结器阻塞,那么我猜这个方法也会阻塞。

当应用程序域关闭时,所有终结器都有时间限制,在这种情况下,我想这并不重要。

于 2012-10-04T16:10:21.767 回答