首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在什么情况下GC.WaitForPendingFinalizers()阻塞在.NET中?

在什么情况下GC.WaitForPendingFinalizers()阻塞在.NET中?
EN

Stack Overflow用户
提问于 2012-10-04 16:03:55
回答 2查看 1.1K关注 0票数 2

引用GC.WaitForPendingFinalizers()的MSDN文档

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

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

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-04 16:13:19

来自关于MSDN的另一篇文章

在下列特殊情况下,Finalize方法可能无法运行到完成,或者根本不运行:

  • 另一个终结器无限期地阻塞(进入无限循环,尝试获得它永远无法获得的锁,等等)。因为运行时试图运行终结器才能完成,因此如果终结器无限期阻塞,则可能不会调用其他终结器。
  • 进程终止,而不给运行时一个清理的机会。在这种情况下,运行库对进程终止的第一个通知是DLL_PROCESS_DETACH通知。
票数 2
EN

Stack Overflow用户

发布于 2012-10-04 16:10:21

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12731280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档