如何将此调用替换为GC.Collect?

时间:2012-07-29 18:05:38

标签: c# .net garbage-collection clr appdomain

我有一个应用程序在伪代码中运行这样的东西:

DisplayPrettyUI()
DoABunchOfReportingWorkThatAllocatesHundredsOfMB()
GC.Collect() //Free up the memory used in generating the report
DisplayReport()

现在,我无法完全摆脱collect调用,因为如果我这样做,那么在生成报告之后,进程会保留超过GB的内存,尽管应用程序只托管UI组件来显示当时的报道。与此同时,对Collect的呼吁似乎“臭”;并且似乎必须有一些方法来处理这种情况而不去那里。

可以去除这种气味吗? (我听说过像AppDomain这样的东西来解决这个问题,但我之前从未使用过AppDomain,也不知道它对垃圾收集器有什么语义......)

2 个答案:

答案 0 :(得分:2)

您可以使用Optimized的GCColletionMode标志调用GC.Collection,这样就不一定会在此时强制执行垃圾收集....如果没有必要,GC可以延迟它。

另外看一下AddMemoryPressure,这里有一些想法:

答案 1 :(得分:1)

我们通常解决这个问题的方法是将报表拆分为单独的线程甚至物理进程,具体取决于我们使用的工具。

有一些第三方报告工具是绝对的资源浪费,并且在崩溃时倾向于关闭整个应用程序。将它们转移到自己的进程中可以隔离潜在的损害,并允许我们实例化到足以使我们处于资源限制之下,但仍能响应用户请求。

话虽如此,如果这不适合您的申请,我认为在您的情况下使用Collect没有任何问题。