3

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

1 回答 1

1

时间消耗在ReadToEnd

利用

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

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

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

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

此外,您可能想研究异步传输,这是从网络获取数据的正确方法:HttpWebRequest - 异步编程

于 2012-05-10T02:38:33.310 回答