用于System.Xml.Xsl.XslCompiledTransform类状态的.NET:
螺纹安全 1 XslCompiledTransform对象在加载后是线程安全的。换句话说,在Load方法成功完成之后,可以从多个线程同时调用转换方法。 2如果在一个线程中再次调用Load方法,而在另一个线程中调用Transform方法,则XslCompiledTransform对象将继续使用旧状态来执行转换调用。当加载方法成功完成时,将使用新状态。 3注释当从多个线程同时调用时,Load方法不是线程安全的。
我确信1 & 2段是指在同一个XslCompiledTransform对象实例上调用Load()/Transform() (在多个线程中)。但是对于3,是否有人知道它们是指同一实例上的同步Load()s,还是(有某种静态的东西意味着)您必须从所有实例中相互排除并发Load()s?
发布于 2014-12-06 11:40:36
查看ILSpy中的代码,没有可见的静态同步结构。您可以对来自不同线程的不同实例调用Load()。
可以预见的是,Load将实例化XSLT编译器并将样式表编译到内部对象,稍后转换方法将使用该对象。这就解释了1:一旦编译了转换,就可以从不同的线程调用它,因为内部对象现在是只读的。
再次调用Load将重新编译内部对象,因此它必须与当前正在进行的任何转换同步,这相当于2。
同时从不同线程调用编译器将创建构建最终内部转换对象(3)的竞赛。但是不同的实例是独立的,它们都有自己的内部转换对象,每次调用Load时都会实例化一个新的编译器。
https://stackoverflow.com/questions/27316343
复制相似问题