Устраняет ли режим PowerShell STA проблему утечки памяти SharePoint?
-
19-09-2019 - |
Вопрос
Немного предыстории:
- SharePoint+PowerShell (обычно) идеально подходит Зак Розенфилд [MSFT]
- Обходные пути утечки данных в SharePoint+PowerShell мной
- ТАК: Не могли бы вы объяснить STA и MTA?
Короче говоря, стандартное руководство SharePoint заключается в том, что объекты, поддерживаемые COM, такие как SPSite
и SPWeb
не должен использоваться разными потоками.Это противоречит использованию PowerShell режима MTA по умолчанию, что проверено в статье «Обходные пути утечки», упомянутой выше.Одним из предложенных обходных путей было использование флага -STA в PowerShell 2.0, который, похоже, должен решить проблему;однако в комментариях к своему посту Зак предполагает, что режима STA недостаточно.
Это подводит меня к пределу моих знаний в области COM, поэтому я надеюсь, что кто-нибудь поможет мне понять...
- Должен ли режим STA быть достаточным для ограничения доступа к объектам одним потоком в конвейерах PowerShell?
- Если нет, то почему?
Решение
В конечном счете, режима -STA должно быть достаточно, если вы используете Powershell 2.0.Причина этого в том, что в режиме STA пространство выполнения по умолчанию повторно использует один поток для всех интерактивных команд (а также сценариев).Возможно, версия powershell, которую Зак рассматривал в феврале, вела себя иначе, чем текущая RC/RTM PowerShell 2.0.Возможно, он использовал UseNewThread вместо текущего значения по умолчанию ReUseThread:
PS> [System.Management.Automation.Runspaces.Runspace]::DefaultRunspace
Events : System.Management.Automation.PSLocalEventManager
ThreadOptions : ReuseThread
RunspaceConfiguration : System.Management.Automation.Runspaces.RunspaceConfigForSingleShell
InitialSessionState :
Version : 2.0
RunspaceStateInfo : Opened
RunspaceAvailability : Busy
ConnectionInfo :
ApartmentState : STA
InstanceId : 8d3bfae1-8b64-433d-9ab9-ce640b15f84f
SessionStateProxy : System.Management.Automation.Runspaces.SessionStateProxy
Debugger : System.Management.Automation.Debugger
Короче говоря, с тобой все в порядке.Усовершенствованный метод, о котором он говорил, скорее всего, заключался в том, как развернуть новое пространство выполнения с помощью ReUseThread, который сейчас является избыточным, поскольку это опция потока по умолчанию для -STA.Однако вы можете использовать эту технику для работы в одном потоке в режиме MTA ;-)
-Ойсин
Microsoft PowerShell MVP