【发布时间】:2013-04-10 00:16:38
【问题描述】:
问题。
- 使用网络 TCP 绑定(发布者/订阅者模式)的 C# WCF 客户端/服务器应用程序。
- 客户端不断崩溃并显示
OutOfMemoryException。 - 当我与客户端一起运行任务管理器时,我可以看到内存使用列增加,直到应用程序崩溃。
- 目的是让客户端的多个实例在不同的机器上运行。
场景
- 我有一个客户端/服务器应用程序。
- 发布者/订阅者设计模式。
- 在服务器端,有 6 个字典组成一个缓存,每个字典都包含一个自定义对象作为值。
- 作为 while 循环的一部分,每组字典值每 5 秒更新一次。
- 在 5 秒循环结束时,将 6 个字典添加到数据合同对象中,每个字典都作为不同的数据成员。
- 然后将数据合同对象通过线路发送到客户端,其中还有 6 个字典。
- 然后,我遍历每个数据协定字典,根据值是否已经存在,添加或更新其客户端等效项的内容。
总结
- 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();
我的问题
- 如何防止客户端内存使用量不断增长?
- 如果我只发送对象的通用列表而不是可序列化的字典,客户端的内存使用会显着降低吗?
- 我是否为这种实现正确设置了绑定配置?
- 对于解决此内存问题的任何其他建议,我们将不胜感激。
【问题讨论】:
-
鉴于您提出的问题数量以及接受率和点赞率较低,您能解释一下帮助您的动机吗?
-
我们在工作中使用 IE6,我不能接受,因为接受按钮上的 JScript 不起作用,而且我担心它是一家公司,一切都被严重锁定。我不倾向于在家中经常使用互联网,所以我没有机会接受太多答案。另外,您忘记了一个事实,有时可能有 20 个答案,但它们可能都是垃圾和不相关/不正确的。
-
好吧,SO 并不适合所有人。我推荐expertsexchange。
-
我很难理解为什么你有这样的问题?
-
因为它非常令人沮丧,尤其是这样一个非常沉重的问题,它会吓跑人们。当你花时间接受你的问题的答案时,你会让很多人开心。人们会花时间回答您的问题,如果您因为无法下班而需要在家回答问题,那么实际花费这些时间似乎是一种票价交易。
标签: c# wcf out-of-memory