挂起的 HtmlAgilityPack 任务

Hanging HtmlAgilityPack Task

我正在尝试使用 HtmlAgilityPack 解析 html 页面以从中提取链接,然后将链接添加到 ListBox,然后将 listBox 中的链接添加到队列。
我有三个任务(PageParse、AddItemsToList、EnqueueFromList)
好的我的问题是当我点击按钮时整个应用程序都挂了。
按钮代码

private void CrawdBtn_Click(object sender, EventArgs e)
    {
        t = Task.Factory.StartNew(PageParse);
        t.Wait();
        TaskAddToList = Task.Factory.StartNew(() => AddItemsToList(t.Result));
        TaskAddToList.Wait();

        b = new Task(EnqueueFromList);
        b.Start();
        //Task.WaitAll(t,b);
        CrawdBtn.Enabled = true;

    }

页面解析方法

public HtmlAgilityPack.HtmlDocument PageParse()
    {
        MessageBox.Show($"Page Parse Has started");

        web = new HtmlWeb();
        doc = new HtmlAgilityPack.HtmlDocument();
        doc = web.Load(UrlText.Text);



        return doc;
    }


将项目添加到列表代码

private void AddItemsToList(HtmlAgilityPack.HtmlDocument doc)
    {
        foreach (HtmlNode Node in doc.DocumentNode.SelectNodes("//a[@href]"))
        {
            HtmlAttribute att = Node.Attributes["href"];
            listBox1.Invoke(new AddToListDelegate(AddToList), att.Value);
            Thread.Sleep(1000);
        }
    }

我通过以下断点注意到调试器在执行 PageParse 方法时挂起

如果您对使用异步方法感兴趣,请像这样以异步方式使用 PageParse

    public static async Task<HtmlDocument> PageParse(String url)
    {
        return await new HtmlWeb().LoadFromWebAsync(url);
    }

您还可以使用 Linq 获取所有 href 值的列表,然后将/AddRange 分配给 AddToList。这将防止从站点返回的 "each" 个 URL 出现 1 秒的延迟。

t.Result.DocumentNode.SelectNodes("//a[@href]").Select(x => x.Attributes["href"].Value).ToList();

我不确定第三个任务的作用,但建议用上述方法测试这两个任务,看看它是否解决了您的挂起问题。