在哪种情况下GC.WaitForPendingFinalizers()在.NET中阻止?

时间:2012-10-04 16:03:55

标签: .net multithreading garbage-collection finalizer

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

  

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

来自another article on MSDN

  

Finalize方法可能无法运行完成或可能无法运行   所有在以下特殊情况下:

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

  •   
  • 该过程终止,而不给运行时提供清理的机会   起来。在这种情况下,运行时的第一个进程通知   终止是DLL_PROCESS_DETACH通知。

  •   

答案 1 :(得分:1)

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

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

当app域关闭时,所有终结器都有一个时间限制,在这种情况下我猜它并不重要。