GC.Collect()阻塞了吗?

Cod*_*ats 15 c# garbage-collection

我正在对我的代码运行一些基准测试,我想确保在我的一个基准测试期间不会发生垃圾收集,因为它正在清理先前测试的混乱.我认为我最好的机会是在开始基准测试之前强制收集.

所以我在基准测试开始之前调用GC.Collect()但不确定收集是否继续在单独的线程中运行等,并立即返回.如果它确实在BG线程上运行,我想知道如何同步调用它或至少等待它完成收集.

Max*_*xim 13

正如MSDN所述 - 使用此方法尝试回收所有无法访问的内存.

无论如何,如果确实开始垃圾收集,你应该等到所有的终结者完成开始基准测试之前.

   GC.Collect();

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


Sho*_*ked 11

.NET Framework 4.5开始,您可以指定GC集合是否应该阻塞:

GC.Collect(GC.MaxGeneration, GCCollectionMode.Optimized, blocking: true);
Run Code Online (Sandbox Code Playgroud)

要么

GC.Collect(GC.MaxGeneration, GCCollectionMode.Default, blocking: true);
Run Code Online (Sandbox Code Playgroud)

GCCollectionMode.Default 目前默认为 GCCollectionMode.Forced

有关详细信息,请参阅:

MSDN:GC.Collect方法(Int32,GCCollectionMode,Boolean)

MSDN:诱导收藏 - 指南