不能将HtmlAgilityPack与多线程一起使用

时间:2018-05-22 20:22:08

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

我正在HtmlAgilityPack使用Parallel.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的情况下调用该方法,那么我该怎样才能解决这个问题?

堆栈跟踪

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)

1 个答案:

答案 0 :(得分:1)

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

如果你想解析/读取HtmlDocument对象异步,那么这将是一件事,但你正在积极地写入HtmlDocument对象,这意味着无序程序执行可以将对象属性设置为null,同时也试图迭代该财产。