¿Cuáles son algunas razones por las que NetworkStream.Read se colgaría / bloquearía?

a documentación de @MSDN parece sugerir que NetworkStream.Read siempre regresará de inmediato. Si no se encuentran datos, devuelve 0. Sin embargo, tengo un código que está implementado actualmente, que solo en algunos casos (y aún no he descubierto cuáles), NetworkStream.Read parece bloquearse. Aquí está el seguimiento de la pila que pude recopilar de un archivo de volcado

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)

Me doy cuenta de que NetworkStrea.Read en realidad llama a Socket.Receive, que, según tengo entendido, puede estar bloqueando. Simplemente no sé por qué a veces se bloquearía y otras no.

Respuestas a la pregunta(4)

Su respuesta a la pregunta