MSDN 文档似乎暗示 NetworkStream.Read 总是会立即返回。如果未找到数据,则返回 0。但是,我有一些当前部署的代码,仅在某些情况下(我还没有弄清楚哪些情况),NetworkStream.Read 似乎挂起。这是我能够从转储文件中收集的堆栈跟踪
00000000705ae850 000007fef784f60d DomainBoundILStubClass.IL_STUB(IntPtr,字节*,Int32,System.Net.Sockets.SocketFlags) 00000000705ae930 000007fef785c930 System.Net.Sockets.Socket.Receive(字节 [],Int32,Int32,System.Net.Sockets.SocketFlags,System.Net.Sockets.SocketError ByRef) 00000000705ae9b0 000007ff004eb668 System.Net.Sockets.NetworkStream.Read(字节 [],Int32,Int32) 00000000705aea40 000007fef784e6ae MySocketStuff.SocketConnectCallback(System.IAsyncResult) 00000000705aeb20 000007fef84f2bbb System.Net.LazyAsyncResult.Complete(IntPtr) 00000000705aeb90 000007fef7853c7b System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,System.Threading.ContextCallback,System.Object) 00000000705aebe0 000007fef784e5d3 System.Net.ContextAwareResult.Complete(IntPtr) 00000000705aec40 000007fef7d027f9 System.Net.LazyAsyncResult.ProtectedInvokeCallback(System.Object,IntPtr) 00000000705aeca0 000007fef8b9815e System.Net.Sockets.Socket.ConnectCallback() 00000000705aed20 000007fef93e14c2 System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(System.Object,布尔值)
我注意到 NetworkStrea.Read 实际上调用了 Socket.Receive,据我所知,这可能是阻塞的。我只是不知道为什么有时它会阻塞,有时它不会。