2012-07-29 44 views
1

我这伪作品像这样的应用程序:如何将此调用替换为GC.Collect?

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

现在,我不能得到彻底的摆脱了对方付费电话的,因为如果我这样做的过程中持有以多GB的生成报告后的内存,尽管应用程序仅托管UI组件以显示当时的报告。与此同时,收集电话似乎“臭”;似乎必须有某种方式来处理这种情况,而不必去那里。

消除这种味道可能吗? (我已经听说过像AppDomain这样的解决方案,但是我从来没有使用过AppDomain,并且不知道它对垃圾收集器有什么语义...)

+4

为了这听起来像一个合法使用GC.Collect'的'。 – CodesInChaos 2012-07-29 18:07:12

+0

@CodesInChaos:在某些方面是的;但似乎这可能会更有效率。我作为应用程序开发人员知道,整个成千上万的对象可以立即死亡;不需要收集分析。如果CLR中某种地方没有这种模式的话,我会很惊讶。 – 2012-07-29 18:08:47

+1

尝试尽可能优化DoABunchOfReportingWorkThatAllocatesHundredsOfMB(),但除此之外没有太多其他选项 – ghostbust555 2012-07-29 18:09:02

回答

1

我们通常会处理这是为了将报告分成单独的线程或甚至物理过程,具体取决于我们使用的工具。

有一些第三方的报告工具是绝对的资源浪费,并倾向于在整个应用程序崩溃时关闭它。将它们转化为自己的进程隔离潜在的破坏,并允许我们实例化,足以将我们控制在我们的资源限制之下,但仍对用户请求做出响应。话虽如此,如果这不适合您的应用程序,我认为在您的情况下使用Collect没有任何问题。

+2

嗯...不是AppDomain是.NET land的“过程”吗? – 2012-07-29 18:22:38

+0

是的,但我们发现,因为某些第三方工具是基于COM的,所以使用独立进程是最安全和最干净的。 – 2012-07-29 18:30:00

+0

这里没有第三方工具... – 2012-07-29 18:31:16