我正在尝试实现一个通过套接字向服务器发送消息的模块。它将在多线程环境中使用,因此这个“Client”对象在线程之间共享。 我的问题是,我应该在Send方法中使用锁定块来使此类线程安全吗? (可能是的,但我看到了很多示例代码,没有任何锁定。)
以下是我的MessengerClient
课程的简化版。
public class MessengerClient
{
private Socket socket;
public MessengerClient()
{
socket = new Socket(SocketType.Stream, ProtocolType.IPv4);
}
public void Connect(string host, int port)
{
socket.Connect(host, port);
}
public void SendMessage(IMessage message)
{
var buffer = ObjectConverter.ConvertToByteArray(message);
var args = new SocketAsyncEventArgs();
args.Completed += args_Completed;
args.SetBuffer(buffer, 0, buffer.Length);
//lock (socket)
//{
socket.SendAsync(args);
//}
}
}
答案 0 :(得分:1)
根据the documentation for Socket:
线程安全:
此类的实例是线程安全的。
所以尽管thread safe is a somewhat ambiguous term,在这个上下文中它意味着这个类的方法,包括实例方法,从你的角度看似是原子的。你可以调用一个方法,并且知道它看起来好像完全在同一时间在其他线程中调用的任何方法之前或之后完全运行。它不会执行一个方法的一半,然后是另一个方法,然后完成第一个方法(除非它可以保证在分割时输出与使它们完全原子化相同)。
因此,简而言之,您不需要添加lock
。 Socket
类将确保在[或大约]同时从多个线程调用方法时没有竞争条件。