C# 挂起HtmlAgilityPack任务
我试图用HtmlAlityPack解析html页面,从中提取链接,然后将链接添加到列表框,然后将链接从列表框添加到队列。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
我有三个任务(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();