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)
正如Socket类的文档中所述,此类的实例是线程安全的。因为套接字代表双工连接 - 您可以在不同的线程上安全地发送和接收。您还可以在不锁定的情况下从多个线程发送数据,但请注意,在这种情况下不能保证顺序(因此,如果您使用多个发送操作发送单个逻辑结构 - 您需要锁定它们以免相互干扰)。
但请注意,如果您通过发送一些数据作为响应来对收到的某些数据做出反应- 您需要锁定整个接收发送块,并锁定来自另一个线程的发送。