引用GC.WaitForPendingFinalizers()的MSDN文档:
运行终结器的线程未指定,因此无法保证此方法将终止。
我真的不明白这句话。在哪种情况下这种方法不会终止?这与终结器运行的线程有什么关系?为什么他们声明线程是“未指定的”?
关于终结器线程,我假设以下是正确的(?):
注意:我可以想象这个方法会在其中一个终结器阻塞时阻塞,但无论终结器使用什么线程,这个问题都会存在。
答案 0 :(得分:2)
Finalize方法可能无法运行完成或可能无法运行 所有在以下特殊情况下:
另一个终结器无限期地阻塞(进入无限循环, 试图获得一个永远无法获得的锁等等。因为 运行时尝试运行终结器以完成其他终结器 如果终结器无限期阻塞,则可能无法调用。
该过程终止,而不给运行时提供清理的机会 起来。在这种情况下,运行时的第一个进程通知 终止是DLL_PROCESS_DETACH通知。
答案 1 :(得分:1)
首先,您通常不需要在GC类中使用方法,除了可能用于SuppressFinalize。大多数其他方法通常会使应用程序执行得最差,而不是更好。
但是,为了回答你的问题,据我所知,当收集执行时,内部列表由终结器的垃圾收集器保存,并且它们都在同一个线程上顺序运行。这意味着,如果一个终结器块,那么我猜这个方法也会阻塞。
当app域关闭时,所有终结器都有一个时间限制,在这种情况下我猜它并不重要。