1

我有一个应用程序,它在伪代码中像这样工作:

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

现在,我无法完全摆脱 collect 调用,因为如果我这样做了,那么在生成报告后,该过程会保留超过 GB 的内存,尽管应用程序只托管 UI 组件来显示报告时间。同时,对 Collect 的调用似乎很“臭”;似乎必须有某种方法可以在不去那里的情况下处理这种情况。

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

4

2 回答 2

2

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

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

于 2012-07-29T22:23:48.090 回答
1

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

有一些第三方报告工具是绝对的资源消耗者,当它们崩溃时往往会导致整个应用程序崩溃。将它们分离到自己的进程中可以隔离潜在的损害,并允许我们实例化足以使我们保持在资源限制之下,但仍能响应用户请求。

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

于 2012-07-29T18:21:41.673 回答