下载超时文件

时间:2012-05-10 01:07:20

标签: c# .net httpwebrequest

我试图从网页上下载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

1 个答案:

答案 0 :(得分:1)

ReadToEnd

消耗的时间

使用

public virtual int Read(
    char[] buffer,
    int index,
    int count
)

将计数设置为4000,即使是最慢的连接也应该有足够的带宽来提供4000个字符或8kB几乎是即时的。

确保在每次读取之间增加缓冲区的索引,或者您可以使用8kB缓冲区,并且每次迭代只需将其内容添加到动态缓冲区。

在检查时间的循环中使用Read,如果大于超时,则退出;如果Read返回小于count的值,则退出。

此外,您可能希望查看异步传输,从网络获取数据的正确方法:HttpWebRequest - Asynchronous Programming