WCF客户端代理使用,由Timer保存在内存中的字符串信息。泄漏?

时间:2016-04-05 16:07:25

标签: c# wcf timer proxy

我正在使用一个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保留路径我看到两条通过Timer的路径:

System.Net.TimerThread+TimerQueue : Roots={Handle, Static reference }.m_Timers ->
System.Net.TimerThread+TimerNode.next ->
System.Net.TimerThread+TimerNode

System.Net.TimerThread + Callback

的保留路径
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#的人,所以请保持温柔!

1 个答案:

答案 0 :(得分:0)

根据您的保留路径,您可能会点击内部计时器来关闭服务点。

这由System.Net.ServicePointManager.MaxServicePointIdleTime属性控制,默认值为100秒。

因此,您可以尝试查看这些字符串是否在应用程序空闲2分钟后消失,或者在调用WCF客户端之前将此超时设置为较小(例如1秒)。