byte [] buffer = new byte [4];
buffer = "AAA";
this.networkStream.Write(buffer , 0 , 4);
this.networkStream.Flush();
我可以使用同一个套接字启动多个线程同时通过套接字发送流吗?
如果我有两个线程,一个是发送一个4字符AAA的缓冲区,另一个是BBB
另一端的数据会看起来像AAABBB还是混合字母ABABAB?
答案 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);
}
}