C# 网络流池
我有一个多线程应用程序,它通过TCP连接与服务器通信。该应用程序将作为windows服务部署 它的实现方式是,C# 网络流池,c#,.net,networkstream,object-pooling,C#,.net,Networkstream,Object Pooling,我有一个多线程应用程序,它通过TCP连接与服务器通信。该应用程序将作为windows服务部署 它的实现方式是,Controller创建Communicator对象,将端口号、消息计数等属性分配给Communicator,并调用其StartClient方法开始与服务器的对话 在StartClient方法中,每个Communicator对象使用控制器指定的端口号和url创建到服务器的连接。建立连接后,它会在内部创建一个线程并调用ReadMessages方法,该方法会一直从服务器读取消息,直到满足消息
Controller
创建Communicator
对象,将端口号、消息计数等属性分配给Communicator
,并调用其StartClient
方法开始与服务器的对话
在StartClient
方法中,每个Communicator
对象使用控制器指定的端口号和url创建到服务器的连接。建立连接后,它会在内部创建一个线程并调用ReadMessages
方法,该方法会一直从服务器读取消息,直到满足消息计数,然后关闭
根据运行时条件,可能需要重用Communicator
对象来再次与服务器对话,因此将再次调用ReadMessages
方法
最初,当ReadMessages
方法完成时,我们一直在调用NetworkStream、StreamReader和StreamWriter对象的Dispose()
方法,但在重新连接场景中,它通常会抛出“无法访问已处置对象”错误。因此,我们注释掉了测试的Dispose
方法调用
到目前为止,它运行良好,但我担心,这不是实现此功能的最佳方式,因为我从未处理过对象
我在考虑对象池,是否有可能有一个流对象池,可以被不同的线程重用
解决这个问题的一种方法是每次通信器连接到服务器时创建一个新的流对象实例,但我认为这将是一个昂贵的操作
您能帮我找出一种更好的方法来处理这种情况吗?这样我就可以在不影响性能的情况下重用通信器
对象了?该方法将基于您需要阅读消息的频率-如果偶尔是n,我建议您重新考虑通信器对象,以使“阅读信息“原子操作-即,它将连接到服务器,创建网络流,读取消息,然后处理所有内容。谢谢@VinayC,但读取操作是主要任务,并且正在持续运行。这就是为什么,我认为每次重新实例化新对象都会非常昂贵的原因。@Danish,根据您的描述,它似乎是以块的形式发生的(一个块就是一定数量的消息)-因此我的建议是基于块被读取的频率。例如,假设重新连接的开销为5秒,块平均读取时间为5分钟,那么重新连接是有意义的。如果它是一个线程,我仍然认为它可以,但考虑多个线程并行运行。你还会觉得每个线程每隔5分钟左右创建一个新实例是个好主意吗?当然,如果没有其他方法,我会这么做,但这真的是唯一的选择吗?你认为通过重用Communicator对象会获得什么性能提升?@jgauffin这不仅仅是性能问题。通信器使用一些令牌来验证请求,这些令牌由控制器在实例化这些对象时分配。我们需要重用,以便使令牌关联保持完整。