【问题标题】:Cannot use HtmlAgilityPack with multithreading不能将 HtmlAgilityPack 与多线程一起使用
【发布时间】:2018-05-22 20:22:08
【问题描述】:

我将HtmlAgilityPackParallel.Invoke 一起使用,特别是我有一个名为Table 的类,其中包含此实现:

public class Table
{
   HtmlDocument doc = new HtmlDocument();

   public void Foo1()
   {
       doc.LoadHtml("some html");
   } 

   public void Foo2()
   {
       doc.LoadHtml("some html");
   } 

   public void Foo3()
   {
        doc.LoadHtml("some html");
   } 
} 

现在的问题是,如果我这样做:

 Table table = new Table();

 Parallel.Invoke(
  () => table.Foo1(),
  () => table.Foo2(),
  () => table.Foo3());

我会得到:

意外错误

来自 HtmlAgilityPack 的异常,特别是在第三种方法上。我可以看到同时该对象被其他两种方法使用(当然,我使用的是Parallel)。

如果我在没有Parallel 的情况下调用该方法都可以正常工作,我该如何处理这个问题?

堆栈跟踪

at HtmlAgilityPack.HtmlNodeCollection.Append(HtmlNode node) in C:\Users\Jonathan\Desktop\Z\zzzproject\HtmlAgilityPack\HtmlAgilityPack.Shared\HtmlNodeCollection.cs:line 321 at HtmlAgilityPack.HtmlNode.AppendChild(HtmlNode newChild) in C:\Users\Jonathan\Desktop\Z\zzzproject\HtmlAgilityPack\HtmlAgilityPack.Shared\HtmlNode.cs:line 818 at HtmlAgilityPack.HtmlDocument.PushNodeEnd(Int32 index, Boolean close) in C:\Users\Jonathan\Desktop\Z\zzzproject\HtmlAgilityPack\HtmlAgilityPack.Shared\HtmlDocument.cs:line 1882 at HtmlAgilityPack.HtmlDocument.Parse() in C:\Users\Jonathan\Desktop\Z\zzzproject\HtmlAgilityPack\HtmlAgilityPack.Shared\HtmlDocument.cs:line 1424 at HtmlAgilityPack.HtmlDocument.Load(TextReader reader) in C:\Users\Jonathan\Desktop\Z\zzzproject\HtmlAgilityPack\HtmlAgilityPack.Shared\HtmlDocument.cs:line 706 at HtmlAgilityPack.HtmlDocument.LoadHtml(String html) in C:\Users\Jonathan\Desktop\Z\zzzproject\HtmlAgilityPack\HtmlAgilityPack.Shared\HtmlDocument.cs:line 752 at SWP.Controllers.TableController.GetAttendanceTable(Int32 seasonId, Int32 competitionId, Int32 roundId, Int32 groupId)

【问题讨论】:

  • 堆栈跟踪会更有帮助。
  • @Aybe 添加,检查
  • 看看这个 GitHub 搜索,它会给你一个提示:github.com/zzzprojects/html-agility-pack/…
  • 您预计会发生什么?你试图使用的对象不能像那样并行使用,所以你不能做你想做的事。我们需要更多地了解您为什么要这样做,以便更好地回答该怎么做。

标签: c# .net multithreading html-agility-pack


【解决方案1】:

您正在尝试将 html 异步加载到同一个 HtmlDocument 对象,几乎没有库准备处理非静态类的异步修改,这就是(在某些方面)存在锁定的原因。我猜每次你将 HTML 加载到对象时,它都会重新启动 HTML 节点的树节点数据结构,从而搞砸一切。

如果您想异步解析/读取 HtmlDocument 对象,那将是一回事,但您正在积极写入 HtmlDocument 对象,这意味着乱序程序执行可能会在尝试将对象属性设置为 null 时遍历该属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    相关资源
    最近更新 更多