引用GC.WaitForPendingFinalizers()的 MSDN 文档:
运行终结器的线程未指定,因此无法保证此方法会终止。
我真的不明白这句话。这个方法在什么情况下不会终止?这与终结器运行的线程有什么关系?为什么他们说线程是“未指定的”?
关于终结器线程,我假设以下是正确的(?):
- 只有一个终结器线程。
- 终结器总是在单独的线程上运行(即从不在主线程或任何其他用户创建的线程上)。
注意:我可以想象这个方法会在终结器之一阻塞时阻塞,但是无论终结器使用什么线程,这个问题都存在。
引用GC.WaitForPendingFinalizers()的 MSDN 文档:
运行终结器的线程未指定,因此无法保证此方法会终止。
我真的不明白这句话。这个方法在什么情况下不会终止?这与终结器运行的线程有什么关系?为什么他们说线程是“未指定的”?
关于终结器线程,我假设以下是正确的(?):
注意:我可以想象这个方法会在终结器之一阻塞时阻塞,但是无论终结器使用什么线程,这个问题都存在。
来自MSDN 上的另一篇文章:
在以下异常情况下,Finalize 方法可能不会运行完成或根本不会运行:
另一个终结器无限期地阻塞(进入一个无限循环,试图获得一个它永远无法获得的锁,等等)。因为运行时会尝试运行终结器以完成,所以如果终结器无限期地阻塞,则可能不会调用其他终结器。
该进程在没有给运行时清理机会的情况下终止。在这种情况下,运行时的第一个进程终止通知是 DLL_PROCESS_DETACH 通知。
首先,你通常不需要在 GC 类中使用方法,可能除了 SuppressFinalize。大多数其他方法通常会使您的应用程序性能最差,而不是更好。
但是,为了回答你的问题,据我所知,当收集执行时,终结器的垃圾收集器持有一个内部列表来运行,它们都在同一个线程上按顺序运行。这意味着,如果一个终结器阻塞,那么我猜这个方法也会阻塞。
当应用程序域关闭时,所有终结器都有时间限制,在这种情况下,我想这并不重要。