【发布时间】:2012-03-11 12:33:17
【问题描述】:
您好,在双工模式下运行 WCF 的服务存在很大问题。
它会泄漏内存(不多,但每天大约 80MB),在让内存分析器与服务一起运行 24 小时后,我发现大部分内存位于 byte[] 中,引用相当混乱,但我大多数引用都以某些东西结尾像这样:
“根”看起来像这样:
我也看到很多 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,所以我的代码中根本没有这些对象的句柄。
除了每隔几天重新启动服务之外,我真的不知道如何处理这个问题 - 我现在不想提出一个解决方案:(
所以请给我一些帮助/提示 - 非常感谢!
【问题讨论】:
-
如果客户端故障很多并且您必须重新创建回调通道,您是否会看到更高的内存增益?如果客户离开了,你会
Abort回调通道吗? -
这对我来说很难说,但这可能是这种情况 - 不,我不会中止服务器上的频道(我该怎么做 - 使用
GetCallbackChannel<T>我只得到T- 你必须把它转换成某种代理吗?) -
您应该可以将其转换为
IClientChannel -
谢谢 - 在另一篇文章中找到此内容,现在正在实施。当我让你正确时,如果引发了故障事件,我应该在 Clientchannel 上调用 .
Abort对吗? - 我认为我什至可以通过处理 .Close 来改进我的代码,这样我就不会再因为发布到断开连接的客户端而遇到麻烦了。 -
现在正在测试这个 - 我想我必须等待几个小时看看这是否可以 - 顺便说一句:我应该在关闭/故障
IClientChanels上调用 dispose 吗?
标签: wcf memory-leaks duplex