Socket.Receive方法、引发、线程、阻塞详解

图标

豆瓜

豆瓜网

豆瓜网专栏

豆瓜 图标 2020-01-09 04:25:09


MyWebResponse response = request.GetResponse();


.....



while ((nBytes = response.socket.Receive(RecvBuffer, 0, 10240, SocketFlags.None)) > 0)

{

//code, do something

}


问题:根据 http://msdn.microsoft.com/zh-cn/library/26f591ax(v=vs.80).aspx 的描述:

如果没有可读取的数据,则 Receive 方法将一直处于阻止状态,直到数据可用,除非使用 Socket.ReceiveTimeout 设置了超时值。如果超过超时值,Receive 调用将引发 SocketException。如果您处于非阻止模式,并且协议堆栈缓冲区中没有可用的数据,则 Receive 方法将立即完成并引发 SocketException。您可以使用 Available 属性确定是否有数据可以读取。如果 Available 为非零,请重试接收操作。

我想要的是不要发生线程阻塞问题,因为主要是下载网页,很多线程会在中途阻塞,一直停到那个位置(while ((nBytes = response.socket.Receive(RecvBuffer, 0, 10240, SocketFlags.None)) > 0))。 请问如何避免?

response.socket.Receive 导致阻塞,所以while会死在那儿不执行下去。我使用了response.socket.ReceiveTimeout = 50000; 这个不行,因为如果下载的是.rar大文件,才到20% 但超过5秒了,它也会退出。


本文由豆瓜网专栏作家 豆瓜 投稿发布,并经过豆瓜网编辑审核。

转载此文章须经作者同意,并附上出处(豆瓜网)及本页链接。

若稿件文字、图片、视频等内容侵犯了您的权益,请联系本站进行 投诉处理

相关搜索

Socket.Receive
图标 图标

豆瓜

豆瓜网

豆瓜网专栏

全部评论

豆瓜

豆瓜网

豆瓜网专栏

  • 日本花王纸尿裤怎么样
  • volte是什么意思,手机怎么开启volte
  • 华为在英宣布两千万英镑投资计划,拥有7200...
  • 从空调能效标识区分空调耗电能量
  • 马云的hhb酒吧被网友调侃为还花呗
  • 我来说两句