问题。
- 使用 Net TCP 绑定(发布者/订阅者模式)的 C# WCF 客户端/服务器应用程序。
- 客户端不断崩溃
OutOfMemoryException
.
- 当我与客户端一起运行任务管理器时,我可以看到“内存使用情况”列不断增加,直到应用程序崩溃。
- 目的是让客户端的多个实例在不同的计算机上运行。
Scenario
- 我有一个客户端/服务器应用程序。
- 发布者/订阅者设计模式。
- 在服务器端,有 6 个字典组成缓存,每个字典都包含一个自定义对象作为值。
- 每组字典值作为 while 循环的一部分每 5 秒更新一次。
- 在 5 秒循环结束时,6 个字典被添加到一个数据契约对象中,每个字典作为不同的数据成员。
- 然后,数据协定对象通过线路发送到客户端,其中还有 6 个字典。
- 然后,我循环遍历每个数据协定字典,并添加或更新其客户端等效内容,具体取决于值是否已存在。
Summary
- 6 个字典服务器端。
- 数据契约中的 6 个可序列化字典。
- 6 个客户端可绑定词典。
- WCF 使用 Net TCP 绑定通过线路传输数据。
规格
- C# .Net 3.5
- 客户端使用一个 DevExpress 表单和 9 个 DX 网格视图和选项卡控件。
- 大多数自定义对象都包含“子资产”字典。 - 我为这个属性使用了一个可绑定字典,我想当你有几百个对象时,它会产生开销(尽管我不认为使用可序列化字典会有多大区别,因为它们都包含相同的序列化代码) 。
-
两侧的绑定在开始时以编程方式创建一次,并包含相同的设置(见下文)。
NetTcpBinding netTcpBinding = new NetTcpBinding(SecurityMode.None);
EndpointAddress endpointAddress = new EndpointAddress(EndpoindAddress);
InstanceContext context = new InstanceContext(callbackinstance);
netTcpBinding.MaxConnections = 5;
netTcpBinding.MaxBufferSize = 2147483647;
netTcpBinding.MaxBufferPoolSize = 2147483647;
netTcpBinding.MaxReceivedMessageSize = 2147483647;
netTcpBinding.ReceiveTimeout = TimeSpan.MaxValue;
netTcpBinding.CloseTimeout = TimeSpan.MaxValue;
netTcpBinding.TransferMode = TransferMode.Buffered;
netTcpBinding.ListenBacklog = 5;
DuplexChannelFactory<ISubscription> channelFactory =
new DuplexChannelFactory<ISubscription>(
new InstanceContext(this),
netTcpBinding,
endpointAddress);
proxy = channelFactory.CreateChannel();
我的问题
- 如何防止客户端内存使用量不断增长?
- 如果我只发送对象的通用列表而不是可序列化的字典,客户端上的内存使用量是否会显着降低?
- 我是否为这种实现正确设置了绑定配置?
- 任何其他解决此内存问题的建议将不胜感激。
•我怎样才能预防
客户端界面刚刚成长
记忆力呈指数级增长
用法?
嗯,它不会呈指数增长,但请确保你没有零散的参考,
特别是查找可能引用您的杂散对象的事件和 lambda
• 内存使用情况是否会
如果我发送,客户端会低得多
仅对象的通用列表为
反对可序列化的字典?
我对此表示怀疑。
•我是否已设置我的绑定
此类配置正确
的实施?
没有看到他们有任何明显的问题
•解决此问题的任何其他建议
内存问题会很大
赞赏。
查一下Windbg,它需要时间来正确学习,但它可以帮助你看到什么引用了什么......它可能不是你所期望的
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)