.NET C# 套接字在两个不同的线程上发送

use*_*088 4 c# sockets multithreading

我有一个套接字,我在单个线程中接收和发送该套接字。然而,还有另一个线程可以定期使用套接字发送数据。目前,我正在使用共享对象来锁定我的Socket.send()操作。这个锁有必要吗?如果是,即使我只从一个线程接收数据,我是否也需要锁定我的接收方法?

例如在线程1中:

//...some code
 while (offset< len)
    {
       currentBytesRead += Client.Receive(buf, offset, len - offset, SocketFlags.None);
    }
//...some more code...
lock (lockObject)
    {
         Client.Send(outputByte);
    }
Run Code Online (Sandbox Code Playgroud)

在线程2中:

    lock (lockObject)
    {
         Client.Send(outputByte);
    }
Run Code Online (Sandbox Code Playgroud)

Evk*_*Evk 5

正如Socket类的文档中所述,此类的实例是线程安全的。因为套接字代表双工连接 - 您可以在不同的线程上安全地发送和接收。您还可以在不锁定的情况下从多个线程发送数据,但请注意,在这种情况下不能保证顺序(因此,如果您使用多个发送操作发送单个逻辑结构 - 您需要锁定它们以免相互干扰)。

但请注意,如果您通过发送一些数据作为响应来对收到的某些数据做出反应- 您需要锁定整个接收发送块,并锁定来自另一个线程的发送。

  • 是的,因为否则您可能会在接收和发送之间从另一个(第二个)线程获取发送,并且您的客户端会将其解释为对其原始请求的响应。是的,如果客户希望对其原始请求做出任何回应,那就是真的。您可以通过使用一些唯一标识符 (guid) 标记每个请求并在发回响应时包含请求的 id 来解决此问题。然后客户端可以区分该响应是为哪个请求创建的。 (2认同)