挂起的 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();
我不确定第三个任务的作用,但建议用上述方法测试这两个任务,看看它是否解决了您的挂起问题。
我正在尝试使用 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();
我不确定第三个任务的作用,但建议用上述方法测试这两个任务,看看它是否解决了您的挂起问题。