2012-07-29 84 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