AngleSharp 的 HtmlParser 线程安全吗?

Is AngleSharp's HtmlParser threadsafe?

提问人:Bruno Lopes 提问时间:9/13/2016 更新时间:1/11/2023 访问量:536

问:

我可以创建一个线程并在多个线程中安全地使用它吗?private static readonly HtmlParser HtmlParser = new HtmlParser();

或者我应该为每个线程或每个用法创建一个解析器以避免并发问题?

C# .NET HTML 解析 Anglesharp

评论

0赞 BRAHIM Kamel 9/13/2016
您应该更明确地说明您计划使用哪种方法,并向我们提供代码示例。

答:

0赞 George Helyar 9/1/2017 #1

从源代码来看,它应该是线程安全的。对象本身没有可变状态,每次使用默认选项创建一个新的 HtmlParser 似乎比创建一次它没有任何好处,因此您应该能够将其视为单例。唯一的共享状态是它的配置,但默认构造函数使用默认配置,无论如何都是单例。

话虽如此,将其视为单例并没有太大的好处。它避免了分配并减少了 GC,但由于它没有昂贵的构造函数,因此差异不会很大。

0赞 Michael Liu 1/11/2023 #2

我建议您为每个线程创建一个 HtmlParser。原因如下:

  1. 从 AngleSharp 版本 1.0.0 开始,HtmlParser 派生自 EventTarget,它包含可变状态,其方法绝对不是线程安全的。如果一个线程添加/删除事件侦听器,而另一个线程解析 HTML,则可能会出现间歇性错误。
  2. 各种 Parse 方法在合同上不保证是线程安全的。即使这些方法今天恰好是线程安全的(忽略事件问题),它们也可能在将来的版本中变得线程不安全
  3. 目前,HtmlParser 不包含太多状态,因此创建多个实例的成本很低。