Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 网络流池_C#_.net_Networkstream_Object Pooling - Fatal编程技术网

C# 网络流池

C# 网络流池,c#,.net,networkstream,object-pooling,C#,.net,Networkstream,Object Pooling,我有一个多线程应用程序,它通过TCP连接与服务器通信。该应用程序将作为windows服务部署 它的实现方式是,Controller创建Communicator对象,将端口号、消息计数等属性分配给Communicator,并调用其StartClient方法开始与服务器的对话 在StartClient方法中,每个Communicator对象使用控制器指定的端口号和url创建到服务器的连接。建立连接后,它会在内部创建一个线程并调用ReadMessages方法,该方法会一直从服务器读取消息,直到满足消息

我有一个多线程应用程序,它通过TCP连接与服务器通信。该应用程序将作为windows服务部署

它的实现方式是,
Controller
创建
Communicator
对象,将端口号、消息计数等属性分配给
Communicator
,并调用其
StartClient
方法开始与服务器的对话

StartClient
方法中,每个
Communicator
对象使用
控制器指定的端口号和url创建到服务器的连接。建立连接后,它会在内部创建一个线程并调用
ReadMessages
方法,该方法会一直从服务器读取消息,直到满足消息计数,然后关闭

根据运行时条件,可能需要重用
Communicator
对象来再次与服务器对话,因此将再次调用
ReadMessages
方法

最初,当
ReadMessages
方法完成时,我们一直在调用NetworkStream、StreamReader和StreamWriter对象的
Dispose()
方法,但在重新连接场景中,它通常会抛出“无法访问已处置对象”错误。因此,我们注释掉了测试的
Dispose
方法调用

到目前为止,它运行良好,但我担心,这不是实现此功能的最佳方式,因为我从未处理过对象

我在考虑对象池,是否有可能有一个流对象池,可以被不同的线程重用

解决这个问题的一种方法是每次
通信器连接到服务器时创建一个新的流对象实例,但我认为这将是一个昂贵的操作


您能帮我找出一种更好的方法来处理这种情况吗?这样我就可以在不影响性能的情况下重用
通信器
对象了?

该方法将基于您需要阅读消息的频率-如果偶尔是n,我建议您重新考虑通信器对象,以使“阅读信息“原子操作-即,它将连接到服务器,创建网络流,读取消息,然后处理所有内容。

谢谢@VinayC,但读取操作是主要任务,并且正在持续运行。这就是为什么,我认为每次重新实例化新对象都会非常昂贵的原因。@Danish,根据您的描述,它似乎是以块的形式发生的(一个块就是一定数量的消息)-因此我的建议是基于块被读取的频率。例如,假设重新连接的开销为5秒,块平均读取时间为5分钟,那么重新连接是有意义的。如果它是一个线程,我仍然认为它可以,但考虑多个线程并行运行。你还会觉得每个线程每隔5分钟左右创建一个新实例是个好主意吗?当然,如果没有其他方法,我会这么做,但这真的是唯一的选择吗?你认为通过重用Communicator对象会获得什么性能提升?@jgauffin这不仅仅是性能问题。通信器使用一些令牌来验证请求,这些令牌由控制器在实例化这些对象时分配。我们需要重用,以便使令牌关联保持完整。