从同一套接字中线程化网络流

时间:2013-11-09 12:20:15

标签: c# multithreading sockets

byte [] buffer = new byte [4];
buffer = "AAA";
this.networkStream.Write(buffer , 0 , 4);
this.networkStream.Flush();

我可以使用同一个套接字启动多个线程同时通过套接字发送流吗?

如果我有两个线程,一个是发送一个4字符AAA的缓冲区,另一个是BBB

另一端的数据会看起来像AAABBB还是混合字母ABABAB?

1 个答案:

答案 0 :(得分:5)

NetworkStream州的文档:

  

读取和写入操作可以同时执行   不需要NetworkStream类的实例   同步。只要有一个唯一的写入线程   操作和一个唯一的线程用于读取操作,会有   读写线程之间没有交叉干扰,没有   同步是必需的。

所以不,你不应该有多个线程同时写入流。您真的觉得需要有多个编写器,然后您需要通过lock(或其他一些机制)同步对流的访问。但是,如果你这样做,那么你将以串行的方式有效地写入流,所以为什么不简化事情并只是构造代码,以便实际上只有一个编写器。

通过利用BlockingCollection类,可以很容易地将模式与一个编写者一起使用。这是一个简单的例子,演示了如何做到这一点。

public class Example
{
  private NetworkStream networkstream = GetNetworkStream();
  private BlockingCollection<byte[]> queue = new BlockingCollection<byte[]>();

  public Example()
  {
    Task.Factory.StartNew(
      () =>
      {
        foreach (byte[] buffer in queue.GetConsumingEnumerable())
        {
          this.networkstream.Write(buffer, 0, buffer.Length);
        }
      }, TaskCreationOptions.LongRunning);
  }

  public void QueueWrite(byte[] buffer)
  {
    queue.Add(buffer);
  }
}