XslCompiledTransform поток безопасности
MSDN для.NET System.Xml.Xsl. Класс XslCompiledTransform заявляет:
Поток безопасности
[1] Объект XslCompiledTransform является потокобезопасным после его загрузки. Другими словами, после успешного завершения метода Load метод Transform может быть вызван одновременно из нескольких потоков.
[2] Если метод Load вызывается снова в одном потоке, в то время как метод Transform вызывается в другом потоке, объект XslCompiledTransform завершает выполнение вызова Transform, продолжая использовать старое состояние. Новое состояние используется после успешного завершения метода Load.
[3] Примечание. Метод Load не является поточно-ориентированным при одновременном вызове из нескольких потоков.
Я (довольно) уверен, что пункты [1] и [2] имеют в виду Load()
/ Transform()
вызывается (в нескольких потоках) на одном XslCompiledTransform
экземпляр объекта. Но для [3] кто-нибудь знает, имеют ли они в виду одновременное Load()
s в одном и том же экземпляре, или если (есть что-то статичное, что означает, что) вы должны взаимно исключать Load()
из всех случаев?
1 ответ
Глядя на код в ILSpy, нет видимой статической конструкции синхронизации. Ты можешь позвонить Load()
на разных экземплярах из разных тем.
Как и следовало ожидать, Load
создаст экземпляр XSLT-компилятора и скомпилирует таблицу стилей во внутренний объект, который впоследствии будет использоваться методами Transform. Это объясняет [1]: после того как преобразование скомпилировано, его можно вызывать из разных потоков, поскольку внутренний объект теперь доступен только для чтения.
призвание Load
снова будет перекомпилировать внутренний объект, поэтому он должен быть синхронизирован с любым текущим преобразованием, которое учитывает [2].
Вызов компилятора одновременно из разных потоков приведет к гонке за созданием конечного объекта внутреннего преобразования ([3]). Различные экземпляры независимы, у них всех есть свой собственный внутренний объект преобразования, и они создают новый компилятор каждый раз, когда вызывается Load.