我试图从网页上下载html,但我想在10秒后放弃。下面的代码下载文本很好,但它可能需要超过10秒。我有超时设置,但是StreamReading需要很长时间。在关闭连接的同时,在10秒后停止任何进一步处理的最佳方法是什么?
如果req.GetResponse()花费的时间超过10秒,我会收到WebException,但是读取wr.GetResponseStream()需要时间。我还想确保所有连接都正确关闭。
代码:
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Timeout = 10000;
req.ReadWriteTimeout = 10000;
using (WebResponse wr = req.GetResponse())
{
Console.WriteLine("A: " + DateTime.Now.ToString(" HH:mm:ss:fff"));
using (StreamReader sr = new StreamReader(wr.GetResponseStream(), true))
{
Console.WriteLine("B: " + DateTime.Now.ToString(" HH:mm:ss:fff"));
var b = sr.ReadToEnd();
Console.WriteLine("C: " + DateTime.Now.ToString(" HH:mm:ss:fff"));
}
}
示例输出:
A: 20:04:36:522
B: 20:04:36:522
C: 20:04:54:337
Elapsed Time: ~18 Seconds
答案 0 :(得分:1)
ReadToEnd
使用
public virtual int Read(
char[] buffer,
int index,
int count
)
将计数设置为4000,即使是最慢的连接也应该有足够的带宽来提供4000个字符或8kB几乎是即时的。
确保在每次读取之间增加缓冲区的索引,或者您可以使用8kB缓冲区,并且每次迭代只需将其内容添加到动态缓冲区。
在检查时间的循环中使用Read
,如果大于超时,则退出;如果Read
返回小于count的值,则退出。
此外,您可能希望查看异步传输,从网络获取数据的正确方法:HttpWebRequest - Asynchronous Programming