簡體   English   中英

HttpWebRequests阻止來自另一個線程的UI線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM