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

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

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

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

4

1 回答 1

8

状态的文档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);
  }
}
于 2013-11-13T15:44:38.177 回答