我與WCF客戶端這看起來像是一個明確的關閉&代理走出去的範圍後,留在記憶的字符串連接信息工作。我使用的實現類似於這個帖子:WCF客戶端代理使用情況,定時器保存在內存中的字符串信息。泄漏?
Link to another stackoverflow discussion
我做通道收盤已經證實它不是使用的第二時間。如果我使用DotMemory來分析內存,我會看到8個字符串與REST調用機制相關。保留對象如下所示:
System.Net.TimerThread+TimerQueue ->
System.Net.TimerThread+TimerNode ->
System.Net.ConnectionGroup ->
System.Collections.ArrayList ->
System.Object[] ->
System.Net.Connection ->
System.Net.CoreResponseData ->
System.Net.WebHeaderCollection ->
System.String[] ->
System.String
我用來測試的客戶端幾乎沒有任何內容。一個創建代理的按鈕,使用它然後關閉,我的REST調用沒有問題。
使用DotMemory保留路徑我看2路穿過定時器運行:
System.Net.TimerThread+TimerQueue : Roots={Handle, Static reference }.m_Timers ->
System.Net.TimerThread+TimerNode.next ->
System.Net.TimerThread+TimerNode
System.Net.TimerThread +回調
System.Net.TimerThread+TimerQueue : Roots={Handle, Static reference }.m_Timers ->
System.Net.TimerThread+TimerNode.prev ->
System.Net.TimerThread+TimerNode.m_Callback ->
System.Net.TimerThread+Callback
的保留路徑。如果我想弄清楚爲什麼計時器正在發揮作用,我的猜測是WebChannelFactory發生了一些奇怪的事情,可能是我沒有意識到的默認屬性。這只是一個沒有任何回調能力的直接REST調用。
感謝您的耐心,我是自學的C#的人,所以請溫柔!
是什麼在保持字符串在內存中的問題?你有沒有強制垃圾收集? – CodeCaster
我使用GC.Collect()。我意識到它可能不是一個泄漏,但只是在我的應用程序部分使用了不好的內存,但是如果我關閉並允許代理超出範圍,它不會再做有用的工作,所以我不希望它消耗資源卻很少。讓靜態Timer引用持有字符串信息使我感到困惑。 –