C# 客户端C中异步套接字的并行性#

C# 客户端C中异步套接字的并行性#,c#,multithreading,sockets,asynchronous,client,C#,Multithreading,Sockets,Asynchronous,Client,我正在开发一个系统,该系统必须使用TCP从大约200个“传感器”请求信息,因此基本上是一个拥有大量服务器的客户端。每个传感器发送一个未知数量的消息,我必须在0,1秒后每次用ACK回复该消息,最后一个ACK将不会从传感器获得任何回复。最后一条消息由一个标记标识。我将在上次收到信息后延迟0.5秒请求信息 这就是我使用一个传感器的方式: 首先,信息请求: public void Request(string request) { Send_msg(request, this.

我正在开发一个系统,该系统必须使用TCP从大约200个“传感器”请求信息,因此基本上是一个拥有大量服务器的客户端。每个传感器发送一个未知数量的消息,我必须在0,1秒后每次用ACK回复该消息,最后一个ACK将不会从传感器获得任何回复。最后一条消息由一个标记标识。我将在上次收到信息后延迟0.5秒请求信息

这就是我使用一个传感器的方式:

首先,信息请求:

public void Request(string request)
    { 
        Send_msg(request, this.EndPoint);
        System.Threading.Thread.Sleep(500);
        buffer_rcvr = new byte[MaxSizebuffer];

        try
        {
            IAresult3 = socketPC_BB.BeginReceive(buffer_rcvr, 0, MaxSizebuffer, socketFlags, out  errorCode, Package_receive, state);
        }
        catch (SocketException se)
        {
            (Adds error to log)
        }   


private void Send_msg(string str_frame, EndPoint BB_ip_and_port)
    {

        try
        {
            IAresult2 = this.socketPC_BB.BeginSend(FrameToByte_Encoder(str_frame), 0, str_frame.Length, socketFlags, callback, state);
            socketPC_BB.EndSend(IAresult2);
        }
        catch (SocketException se)
        {
            (Adds error to log)
        }         
    }
我就是这样听的:

void Package_receive(IAsyncResult answer)
    {

        Msg= ProcessMessage(ByteToFrame_Decoder(buffer_rcvr));

        System.Threading.Thread.Sleep(100);
        this.Send_msg(ACK, this.EndPoint);

        try
        {
            IAresult3 = this.socket.BeginReceive(buffer_rcvr, 0, MaxSizebuffer, socketFlags, out errorCode, Package_receive, state);

        }
        catch (SocketException se)
        {
            (Adds error to log)
        }
    }
所以这对一个传感器来说是可行的。这段代码的大部分我都没有写,我仍然想知道它是如何在没有调用EndReceive的情况下工作得这么好的。(我怀疑它与超时一起工作-this.socket.ReceiveTimeout=3000;)

我的主要问题是,创建包含IP和端口列表的多个套接字并调用这些方法是否会增加每个传感器的延迟,或者回调是否完全异步,它们是否会在不同的线程中并行工作。我是否需要在回调中使用线程安全方法将所有数据添加到列表中? 最重要的是:手动为每个套接字创建单独的线程,以便在每个传感器的延迟不超过一分钟的情况下继续轮询,这是明智之举还是浪费精力


提前感谢:)

一些评论:一般来说,在考虑时间安排时,您不希望添加如上所示的静态延迟。这是因为代码不能保证硬编码的值在压力系统下按设计工作,这正是您要问的。第2点,每个套接字都是唯一的IP地址/端口对。因此,接收逻辑应该可以识别谁在响应。您无法控制响应时间,为什么还要等待?就线程安全而言,这只适用于将数据追加到列表,只需使用锁定即可。您确实应该调用
EndReceive
。这是通知您异常的唯一方法,也是您知道收到多少字节的唯一方法。此外,每个传感器都需要一个单独的
缓冲区\u rcvr
,因为您可能有多个并发调用。如果没有单独的接收缓冲区,它们将发生冲突。我将重复前面的评论中关于使用静态延迟的警告(即
Thread.Sleep
)。首先感谢您的建议!在弹劾下增加了延迟,这将确保在请求传感器的另一个响应之前强制等待,这就是为什么它被放置在发送ACK消息之前的原因。我从来没有想过使用satic等待可能是个问题,我会用另一种方法来研究如何做到这一点。我也将添加EndReceive。对于不同的buffer_rcvr,hat don b是手动创建不同的线程还是有其他方法?再次感谢您抽出时间阅读并回答!