C# WCF - 客户端/服务器 - System.OutOfMemory 异常

标签 c# wcf out-of-memory

问题。

  • 使用 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/

相关文章:

c# - 检查 JValue 是否为空

asp.net - 通过 Web 服务公开 SQL Server 数据库的最佳方式是什么

Django 操作错误 : could not fork new process for connection

wcf - 在 BizTalk 中禁用 WCF 自签名证书验证

java.lang.OutOfMemoryError(超出 GC 开销限制)

c# - TiffBitmapEncoder,内存错误导致 C#/WPF 中内存不足异常

c# - 将依赖项注入(inject)类库中的 AuthorizeAttribute

c# - 我是如何搞砸 PLINQ 的? (并行化简单/快速计算)

C# OpenXML SDK - 从幻灯片母版插入新幻灯片

c# - 当 MessageContract 位于我的 WCF 服务中时,为什么代理生成的代码会创建一个新类?