0

我的代码中最慢的部分是这些行:

        string responseString;
        var webRequest = WebRequest.Create(url);
        using (var response = webRequest.GetResponse())
        using (var sr = new StreamReader(response.GetResponseStream()))
        {
            responseString = sr.ReadToEnd();
        }
        return responseString;

有没有办法在我的代码解析页面请求之间的 HTML 时“排队”多个 webRequest 并让它们在后台下载?我可以用谷歌搜索这个名称/方法吗?非常感谢任何链接或代码!谢谢!

*编辑:添加完整的 getHTML() 代码

4

2 回答 2

3

您可以使用异步方法来解锁您的 UI 并在那里处理请求。

但是您发布的代码行几乎什么都不做。调用响应时发生对服务器的请求。和:

var respone = webRequest.GetResponse();

只需使用, 来解锁 UI 并在异步进度完成后处理它。

var response = webRequest.GetResponseAsync();
// or BeginResponse() ... EndResponse();

您可以阅读以下内容以获取更多信息: http: //msdn.microsoft.com/en-us/library/86wf6409 (v=vs.110).aspx

于 2013-07-22T09:24:26.113 回答
1

您正在寻找的是一种生产者消费者风格的编程。每当您看到它BlockingCollection通常是一个很好的工具时。它是一个集合(默认使用队列),旨在安全地从多个线程访问。

您可以从异步发出请求的消费者开始,然后将请求的结果放入队列:

BlockingCollection<string> queue = new BlockingCollection<string>();

foreach(string url in links)
    var webRequest = WebRequest.Create(url);
    webRequest.GetRequestStreamAsync()
        .ContinueWith(t => new StreamReader(t.Result).ReadToEnd());

然后,您可以拥有处理队列中每个结果的代码:(如果这也有意义的话,很容易有多个消费者。)

foreach(var fileText in queue.GetConsumingEnumerable())
{
    processText(fileText);
}
于 2013-07-22T20:22:28.763 回答