По каким причинам NetworkStream.Read зависает / блокируется?

Документация 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, который, насколько я понимаю, может блокировать. Я просто не знаю, почему иногда блокируется, а иногда нет.

9
задан Mark 5 August 2011 в 14:52
поделиться