我的代码中最慢的部分是这些行:
string responseString;
var webRequest = WebRequest.Create(url);
using (var response = webRequest.GetResponse())
using (var sr = new StreamReader(response.GetResponseStream()))
{
responseString = sr.ReadToEnd();
}
return responseString;
有没有办法“排队”多个webRequest并让他们在后台下载,而我的代码在页面请求之间解析HTML?有没有这个名字/方法我可以google?任何链接或代码都非常感谢!谢谢!
*编辑:添加了完整的getHTML()代码
答案 0 :(得分:3)
您可以使用异步方法来取消阻止您的UI并在那里处理请求。
但您发布的代码行几乎不应该做任何事情。 调用Response时会发出对服务器的请求。 用:
var respone = webRequest.GetResponse();
只需使用,取消阻止UI并在异步进度完成后处理它。
var response = webRequest.GetResponseAsync();
// or BeginResponse() ... EndResponse();
您可以阅读以下内容以获取更多信息: http://msdn.microsoft.com/en-us/library/86wf6409(v=vs.110).aspx
答案 1 :(得分: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);
}