我想知道如果使用 System.Net.Sockets.NetworkStream.Read 有多个线程等待数据可用会发生什么:
numberOfBytesRead = myNetworkStream.Read(myReadBuffer, 0, myReadBuffer.Length);
共享 myNetworkStream 。当数据可用时,只有一个线程看到它或所有线程吗?
答案 0 :(得分:1)
使用Write和Read方法进行简单的单线程同步阻塞I / O.如果要使用单独的线程处理I / O,请考虑使用BeginWrite和EndWrite方法,或使用BeginRead和EndRead方法进行通信。
...
可以在NetworkStream类的实例上同时执行读写操作,而无需同步。只要有一个用于写操作的唯一线程和一个用于读操作的唯一线程,读写线程之间就不会存在交叉干扰,也不需要同步。
所以我会说行为是未定义的。
答案 1 :(得分:0)
如果您的NetworkStream是共享的,那么您的线程将相互干扰。根据我自己的经验,每个线程可以共享一个Socket,例如,如果你为服务器执行此操作,服务器上的每个线程都可以继续侦听同一个套接字,那么当客户端到达时,一个线程将开始为它服务,然后在另一个客户端到达之后,其他线程将开始服务它们并且它们不会相互干扰。