MSDN のドキュメントは、NetworkStream.Read が常にすぐに返されることを示唆しているようです。データが見つからない場合は 0 が返されます。ただし、現在展開されているコードがいくつかありますが、そのコードは一部のケース (まだどのケースかはわかりません) でのみ、NetworkStream.Read がハングしているように見えます。これは、ダンプファイルから収集できたスタックトレースです
00000000705ae850 000007fef784f60d DomainBoundILStubClass.IL_STUB (IntPtr、Byte*、Int32、System.Net.Sockets.SocketFlags) 00000000705ae930 000007fef785c930 System.Net.Sockets.Socket.Receive (Byte[]、Int32、Int32、System.Net.Sockets.SocketFlags、System.Net.Sockets.SocketError ByRef) 00000000705ae9b0 000007ff004eb668 System.Net.Sockets.NetworkStream.Read(Byte[], 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, Boolean)
NetworkStrea.Read が実際に Socket.Receive を呼び出していることに気付きましたが、これは私が理解している限りブロックされている可能性があります。なぜ時々ブロックされ、時々ブロックされないのかわかりません。