提问人:Bruno Lopes 提问时间:9/13/2016 更新时间:1/11/2023 访问量:536
AngleSharp 的 HtmlParser 线程安全吗?
Is AngleSharp's HtmlParser threadsafe?
问:
我可以创建一个线程并在多个线程中安全地使用它吗?private static readonly HtmlParser HtmlParser = new HtmlParser();
或者我应该为每个线程或每个用法创建一个解析器以避免并发问题?
答:
0赞
George Helyar
9/1/2017
#1
从源代码来看,它应该是线程安全的。对象本身没有可变状态,每次使用默认选项创建一个新的 HtmlParser 似乎比创建一次它没有任何好处,因此您应该能够将其视为单例。唯一的共享状态是它的配置,但默认构造函数使用默认配置,无论如何都是单例。
话虽如此,将其视为单例并没有太大的好处。它避免了分配并减少了 GC,但由于它没有昂贵的构造函数,因此差异不会很大。
0赞
Michael Liu
1/11/2023
#2
我建议您为每个线程创建一个 HtmlParser。原因如下:
- 从 AngleSharp 版本 1.0.0 开始,HtmlParser 派生自 EventTarget,它包含可变状态,其方法绝对不是线程安全的。如果一个线程添加/删除事件侦听器,而另一个线程解析 HTML,则可能会出现间歇性错误。
- 各种 Parse 方法在合同上不保证是线程安全的。即使这些方法今天恰好是线程安全的(忽略事件问题),它们也可能在将来的版本中变得线程不安全。
- 目前,HtmlParser 不包含太多状态,因此创建多个实例的成本很低。
评论