2016-04-05 53 views
0

我與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#的人,所以請溫柔!

+0

是什麼在保持字符串在內存中的問題?你有沒有強制垃圾收集? – CodeCaster

+0

我使用GC.Collect()。我意識到它可能不是一個泄漏,但只是在我的應用程序部分使用了不好的內存,但是如果我關閉並允許代理超出範圍,它不會再做有用的工作,所以我不希望它消耗資源卻很少。讓靜態Timer引用持有字符串信息使我感到困惑。 –

回答

0

根據您的保留路徑上,它看起來像你打了封閉維修點的內部定時器。

這是通過System.Net.ServicePointManager.MaxServicePointIdleTime屬性控制和默認值是100秒。

所以,你可以嘗試看看,如果這些字符串消失,你把你的應用閒置2分鐘後,還是打電話給你WCF客戶端之前剛剛成立這個超時小東西(如1秒)。

+0

太棒了!我會檢查併發布我的結果。謝謝您的意見! –

+0

這看起來不錯!如果我將該值重置爲5秒,請等待,並且GC DotMemory在保留內存時不顯示這些定時器參考。非常好!謝謝Labutin先生! –

+0

好。那麼原來的問題不是這樣的泄漏。這些字符串將最終收集。這隻需要將近2分鐘。 –