C# 挂起HtmlAgilityPack任务

C# 挂起HtmlAgilityPack任务,c#,winforms,web-crawler,task,html-agility-pack,C#,Winforms,Web Crawler,Task,Html Agility Pack,我试图用HtmlAlityPack解析html页面,从中提取链接,然后将链接添加到列表框,然后将链接从列表框添加到队列。 我有三个任务(PageParse、AddItemsToList、EnqueueFromList) 好,我的问题是当我单击按钮时,整个应用程序都挂起了。 按钮代码 页面解析方法 public HtmlAgilityPack.HtmlDocument PageParse() { MessageBox.Show($"Page Parse Has start

我试图用HtmlAlityPack解析html页面,从中提取链接,然后将链接添加到列表框,然后将链接从列表框添加到队列。
我有三个任务(PageParse、AddItemsToList、EnqueueFromList)
好,我的问题是当我单击按钮时,整个应用程序都挂起了。
按钮代码

页面解析方法

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);
    }

我不确定第三个任务是什么,但建议用上述方法测试这两个任务,看看它是否能解决悬而未决的问题。

Wait()
使整个过程同步。(顺便说一句,为什么
TaskFactory.StartNew()
而不是
Task.Run()
?)。您需要使事件处理程序
异步
,然后在方法的本机异步版本不可用时,可以使用
Task.Run()
调用异步方法。例如,将其添加到您的
按钮中。单击
异步处理程序:
var doc=wait getdocumentsync(url)
并添加这两个方法:
内部HtmlAgilityPack.HtmlDocument GetDocument(字符串url)=>newhtmlweb().Load(url)
内部任务getDocumentSync(字符串url)=>Task.Run(()=>GetDocument(url))列表中,然后
var docs=wait Task.whalll([您的任务列表])<代码>文档
将包含所有HtmlDocument对象。或者修改async/sync方法以返回已经详细说明的字符串列表/HtmlElements/任何内容。
    public static async Task<HtmlDocument> PageParse(String url)
    {
        return await new HtmlWeb().LoadFromWebAsync(url);
    }
t.Result.DocumentNode.SelectNodes("//a[@href]").Select(x => x.Attributes["href"].Value).ToList();