3

.NET System.Xml.Xsl 的 MSDN。XslCompiledTransform类状态:

线程安全

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

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

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

我(相当)确定段落[1][2]指的是Load()/在同一个对象实例Transform()上(在多个线程中)被调用。但是对于[3],有没有人知道它们是否意味着同一实例上的同时 s ,或者(有一些静态的东西意味着)您是否必须从所有实例中相互排除并发s ? XslCompiledTransformLoad()Load()

4

1 回答 1

4

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

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

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

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

于 2014-12-06T11:40:36.603 回答