[英]HttpWebRequests blocking UI thread from another thread
我在Seaprate线程上执行多个HttpWebRequests,但是在调用Start()
之后几乎所有时间我的UI线程都被阻塞,我不知道为什么,这是最重要的代码:
private void Start()
{
for (int i = 0; i < 10; i++)
{
var todo = UrlStack.UrlPartitions.First();
UrlStack.UrlPartitions.Remove(todo);
ThreadPool.QueueUserWorkItem(new WaitCallback(ScanSites), todo);
}
}
private void ScanSites(object o)
{
var ToDo = (List<string>)o;
foreach (string Url in ToDo)
{
var state = MakeRequest(Url);
var website = WebsiteProcessing.ProcessResponse(state);
if (website != null)
{
Websites.Add(website);
WebsitesCount++;
this.UIThread(() => lblCrawledWebsites.Text = WebsitesCount.ToString());
}
}
}
private static RequestState MakeRequest(string url)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
...
RequestState state = new RequestState();
HttpWebResponse response = null;
Stream responseStream = null;
StreamReader sr = null;
try
{
response = (HttpWebResponse)request.GetResponse();
responseStream = response.GetResponseStream();
sr = new StreamReader(responseStream);
state.Request = (HttpWebRequest)request;
state.Response = (HttpWebResponse)response;
string strContent = sr.ReadToEnd();
state.ResponseContent = new StringBuilder(strContent);
}
catch
{
return null;
}
finally
{
if (responseStream != null)
responseStream.Close();
if (sr != null)
sr.Close();
if (response != null)
response.Close();
}
return state;
}
我发现了令我非常惊讶的错。 这是一个具有20-30个正则表达式的自定义类,用于使用HtmlAgilityPack提取文本后剥离剩余的HTML,我仍然不明白的是后台线程如何阻止UI,CPU峰值从未超过50%。
可能是因为这个电话吗?
this.UIThread(() => lblCrawledWebsites.Text = WebsitesCount.ToString());
您没有提供UIThread的定义,但看起来像是在编组对UI线程的调用。 在这种情况下,如果“待办事项”列表中有许多URL,则可能会阻塞UI线程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.