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