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

时间:2016-05-26 11:39:40

标签: c# multithreading sockets

我有一个套接字,我收到并发送到一个线程。但是,存在另一个可以周期性地使用套接字发送数据的线程。目前,我正在使用共享对象来锁定我的Socket.send()操作。这个锁是必要的吗?如果是的话,即使我只收到一个帖子,我还需要锁定我的接收方法吗?

例如在Thread1中:

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

在Thread2中:

    lock (lockObject)
    {
         Client.Send(outputByte);
    }

2 个答案:

答案 0 :(得分:2)

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

但请注意,如果您通过响应发送一些数据作出反应,则需要锁定整个receive-send块,并锁定另一个线程的发送。

答案 1 :(得分:1)

套接字是线程安全的,因此在您的示例中不需要锁定。