XslCompiledTransform 线程安全性

3

.NET System.Xml.Xsl.XslCompiledTransform类的MSDN说明如下:

线程安全性

[1] XslCompiledTransform对象在加载后是线程安全的。也就是说,在成功调用Load方法后,可以同时从多个线程调用Transform方法。

[2] 如果在一个线程中再次调用Load方法,同时另一个线程正在调用Transform方法,则XslCompiledTransform对象通过继续使用旧状态来完成Transform调用。当Load方法成功完成时,将使用新状态。

[3] 注意:同时从多个线程调用Load方法时,Load方法不是线程安全的。

我(相当)确定[1][2]段指的是在同一XslCompiledTransform对象实例上调用Load()/Transform()(在多个线程中)。但是对于[3],是否有人知道它们是指在同一实例上同时进行Load(),还是(存在某些静态因素)必须互斥并发Load() 所有实例?

1个回答

4

在ILSpy中查看代码,没有明显的静态同步结构。您可以从不同的线程调用不同实例上的Load()

可以预见的是,Load将实例化一个XSLT编译器并将样式表编译为稍后由Transform方法使用的内部对象。这就解释了[1]:一旦转换已编译,它就可以从不同的线程调用,因为内部对象现在是只读的。

再次调用Load将重新编译内部对象,因此必须与当前进行的任何Transform同步,这就是[2]的原因。

同时从不同线程调用编译器将创建一个竞争来构建最终的内部转换对象([3])。不过,不同实例是独立的,它们都有自己的内部转换对象,并且每次调用Load时都会实例化一个新的编译器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接