2013-02-07 71 views
3

我试图实现一个模块,通过套接字发送消息到服务器。它将用于多线程环境,所以这个“客户”对象在线程之间共享。 我的问题是,我应该使用发送方法的锁块来使这个类线程安全吗? (可能是的,但我看到很多示例代码,没有任何锁定。)线程安全类通过套接字发送消息

这是我的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); 
     //} 
    } 
} 
+1

您的'MessengerClient'是否为每个客户端实例化? – bas

+0

是的,那是我的问题。如果你需要传输线程安全,你有多个对象使用相同的连接?看起来你应该有一个管理网络流量的“连接管理器”对象。 – sircodesalot

+0

这将仅实例化一次,并且其他一些对象(来自不同线程)将通过SendMessage方法发送消息。 – tuta4

回答

1

the documentation for Socket

线程安全:

这个类的实例是线程安全的。

因此,尽管thread safe is a somewhat ambiguous term,这意味着什么在这种情况下是这个类的方法,包括实例方法,从出现你的观点原子。你可以调用一个方法,并且知道它会在几乎同时在其他线程中调用的任何方法之前或完全运行后出现。它不会执行一个方法的一半,然后执行另一个方法,然后完成第一个(除非它可以保证在分割它时输出与完全原子相同)。因此,总之,你不需要添加lockSocket类将确保在[或同时]从多个线程调用方法的结果不存在竞争条件。