我正在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)
答案 0 :(得分:1)
您正在尝试异步地将html加载到同一个HtmlDocument对象,几乎没有编写库来处理非静态类的异步修改,这就是存在(在某些部分)锁定的原因。我猜你每次将HTML加载到对象时都会重新启动HTML节点的树节点数据结构,从而搞砸了所有内容。
如果你想解析/读取HtmlDocument对象异步,那么这将是一件事,但你正在积极地写入HtmlDocument对象,这意味着无序程序执行可以将对象属性设置为null,同时也试图迭代该财产。