你好,我有一个关于运行WCF的服务在双工模式下出现了一些问题。
它会泄漏内存(虽然不多,但每天大约80MB),在将内存剖析器与服务同时运行24小时后,我发现大部分内存都停留在由混乱引用的byte[]
中,但是,我发现大多数引用最终像这样结束:
![one path holding the byte[] - array](https://istack.dev59.com/V1ezH.webp)
"根"看起来像这样:
![root](https://istack.dev59.com/gJPkw.webp)
我还看到了许多ServiceChannel
(大约200个),我想这些通道来自回调通道。
我相当确定我只持有每个连接的客户端的1个通道。
总体而言,我的问题似乎与此相同:memory leak in silverlight Wcf implementation,但位于服务器端。
我甚至尝试了这里提到的[MTAThread]
,链接在此: WCF service leaks handles and memory when a client times out 但它并没有解决问题。
我认为问题不在我的代码上,因为在使用OperationContext.Current.GetCallbackChannel<IServiceConnectorCallback>()
获取回调通道后,我将其包装在自己的对象中,并且它们不会泄漏(每个客户端在内存中只有一个快照)- 当然,我会在多个场合重置这些回调通道,因为通道可能会更改(客户端失去连接或重新连接),但我无法处理旧引用,所以我只是放弃它们,GC应该会对它们进行处理。
我确实在服务中使用了PerCall
,所以在我的代码中根本没有这些对象的句柄。
除了每隔几天重启服务之外,我真的不知道如何处理这个问题 - 这不是我想要的解决方案 :(
所以请给我一些帮助/提示 - 非常感谢!
GetCallbackChannel <T>
,我只得到了T
- 您必须将其转换为某种代理吗?) - Random DevIClientChannel
。 - Richard BlewettAbort
,对吗?- 我认为我甚至可以通过处理.Close
来改进我的代码,这样我就不必再遇到向已断开连接的客户端发布消息时出现问题的情况了。 - Random DevIClientChanels
上是否应该调用 dispose? - Random Dev