问题。
- 使用 Net TCP 绑定(bind)(发布者/订阅者模式)的 C# WCF 客户端/服务器应用程序。
- 客户端不断崩溃并出现
OutOfMemoryException
。 - 当我与客户端一起运行任务管理器时,我可以看到“内存使用量”列增加,直到应用程序崩溃。
- 目的是让客户端的多个实例在不同的机器上运行。
场景
- 我有一个客户端/服务器应用程序。
- 发布者/订阅者设计模式。
- 在服务器端有 6 个字典组成一个缓存,每个字典都包含一个自定义对象作为值。
- 作为 while 循环的一部分,每 5 秒更新一次每组字典值。
- 在 5 秒循环结束时,将 6 个字典添加到数据契约(Contract)对象中,每个字典作为不同的数据成员。
- 然后数据契约(Contract)对象通过线路发送到客户端,那里还有 6 个字典。
- 然后我遍历每个数据契约字典,并添加或更新它的客户端等效项的内容,具体取决于这些值是否已经存在。
总结
- 6 个字典服务器端。
- 数据协定中的 6 个可序列化字典。
- 6 个可绑定(bind)的客户端字典。
- WCF 使用 Net TCP 绑定(bind)通过网络传输数据。
规范
- C#.Net 3.5
- 客户端使用一个 DevExpress 表单和 9 个 DX GridView 和选项卡控件。
- 大多数自定义对象都包含一个“子 Assets ”字典。 - 我为这个属性使用了一个可绑定(bind)的字典,我想当你有几百个对象时它会产生开销(尽管我不认为使用可序列化的字典会产生很大的不同,因为它们都包含相同的序列化代码) .
两侧的绑定(bind)在开始时以编程方式创建一次,并包含相同的设置(见下文)。
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();
我的问题
- 如何防止客户端内存使用量不断增长?
- 如果我只发送对象的通用列表而不是可序列化的字典,客户端的内存使用量是否会显着降低?
- 我是否为此类实现正确设置了绑定(bind)配置?
- 对于解决此内存问题的任何其他建议将不胜感激。
最佳答案
•How can I prevent the client-interface from just growing exponentially in terms of memory usage?
呃,它不会呈指数增长,但要确保你没有杂散的引用, 特别是寻找可能引用了您的杂散对象的事件和 lambda
•Would the memory usage on the client-side be much lower if I sent only Generic Lists of objects as opposed to serializable dictionaries?
我怀疑。
•Have I setup my binding configurations correctly for this kind of implementation?
没有发现任何明显的问题
•Any other suggestions for fixing this memory problem would be greatly appreciated.
查阅Windbg,它需要时间来正确学习,但它可以帮助你看到什么引用了什么......它可能不是你所期望的
关于C# WCF - 客户端/服务器 - System.OutOfMemory 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4122932/