同步运行GC.Collect

Joe*_*ite 15 .net nunit garbage-collection

GC.Collect似乎在后台线程中启动垃圾收集,然后立即返回.如何GC.Collect同步运行- 即等待垃圾收集完成?

这是在NUnit测试的上下文中.我尝试将gcConcurrent设置添加到我的测试程序集的app.config文件中,我尝试使用nunit.exe.config.两者都没有任何影响 - 当我调试时,我仍然可以看到终结器在"GC终结器线程"上运行,而不是调用的线程GC.Collect(NUnit的"TestRunnerThread"),并且两个线程同时运行.

背景:如果他们泄漏(不要调用Dispose on)特定类,我希望我的测试失败.所以我在该类中添加了一个设置静态wasLeaked标志的终结器; 然后我的测试TearDown调用GC.Collect()然后抛出如果wasLeaked是真的.但它并没有确定性地失败,因为当它读取时wasLeaked,终结器通常甚至还没有被调用.(在垃圾收集最终完成之后,它在一些后来的测试中失败了.)

Bri*_*sen 14

终结器在专用的高优先级后台线程上运行.从你帖子的背景中我收集到你可以做到的

GC.Collect();
GC.WaitForPendingFinalizers();
Run Code Online (Sandbox Code Playgroud)

Collect()会安排任何非根实例最后定稿,然后该线程将等待终结器线程来完成.


Luc*_*ero 5

您可以使用GC.RegisterForFullGCNotification,GC.Collect(GC.MaxGeneration)然后使用GC.WaitForFullGCCompleteGC.WaitForPendingFinalizers方法触发完整集合,但请确保仅在测试中使用它,它们不应用于生产代码.