我正在使用一个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#的人,所以请保持温柔!
答案 0 :(得分:0)
根据您的保留路径,您可能会点击内部计时器来关闭服务点。
这由System.Net.ServicePointManager.MaxServicePointIdleTime
属性控制,默认值为100秒。
因此,您可以尝试查看这些字符串是否在应用程序空闲2分钟后消失,或者在调用WCF客户端之前将此超时设置为较小(例如1秒)。