【问题标题】:How do I reuse TcpClients in synchronous blocking mode?如何在同步阻塞模式下重用 TcpClients?
【发布时间】:2012-01-17 20:36:09
【问题描述】:

我有一个 tcpclient 连接到发送 xml 查询和接收 xml 响应的后端系统。

后端要求客户端登录并设置一些环境设置,然后才能进行任何查询。这是一项代价高昂的操作,因此创建 tcpclient 并将其保持打开以进行重复查询是有意义的。

我被告知的后端已针对处理许多连接进行了优化,出于性能原因,我希望有许多 tcpclient 连接。

查询采用包含数千个项目的列表形式。

我的问题是如何最好地创建一组可重用的连接 tcpclients,这样我就可以从列表中执行多个同时请求(比如一次 10 个),哪种模式适合这种情况,有没有我可以学习的示例最佳实践?

目前它只是使用封装了连接和登录过程的单个服务一个一个地执行它们。

QueryService service = new QueryService(server, port, user, pass, params, app);

foreach(var item in queries)
{
    service.ExecuteRequest(item);
}

service.Disconnect();

【问题讨论】:

  • 您是否尝试过在并行 foreach 循环中使用 tcp 客户端的异步方法?
  • 如标题所述,tcpclient处于同步阻塞模式。每个查询必须在后端发送响应之前发送一个结束序列。我不确定是否可以在底层套接字上进行异步读写?

标签: c# multithreading design-patterns task tcpclient


【解决方案1】:

您需要的是 thread pool 或 Object pool 模式。基本上,您可以创建一个Service 对象池,然后当客户端应用程序的任何元素(函数或对象)需要访问服务时 - 它可以仅根据某些标准引用服务对象。

要成功,您必须有一个请求应该是无状态,这样当一个任意服务对象被选择向某个服务器发出请求时——历史不应该产生问题。

【讨论】:

  • 一个对象池似乎很合适,我可能有一些关于使请求无状态的问题,但会进一步调查,感谢您的建议
  • 我实现了一个对象池模式,效果很好,非常感谢您的指点。
猜你喜欢
  • 2017-01-03
  • 2018-04-06
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
  • 2023-03-14
  • 2013-07-20
相关资源
最近更新 更多