При работе со сценарием, использующим RunSpace, я обнаружил, что он занимает все больше системной памяти. Насколько я понимаю, это связано с тем, что открытые RunSpace не закрываются при завершении. Они остаются в памяти, накапливая мегабайты.
Как правильно закрыть RunSpace? Однако я не знаю, сколько времени это займет - 1 секунда или 1 час. Закрывает себя после завершения.
В качестве примера я приведу произвольные сценарии.
Первый сценарий - это то, как я выполняю закрытие RunSpace по мере его завершения (и, по-видимому, оно не работает ).
$Array = 1..10000
$PowerShell = [PowerShell]::Create()
$RunSpace = [Runspacefactory]::CreateRunspace()
$RunSpace.Open()
$RunSpace.SessionStateProxy.SetVariable('Array', $Array)
$RunSpace.SessionStateProxy.SetVariable('PowerShell', $PowerShell)
$PowerShell.Runspace = $RunSpace
[void]$PowerShell.AddScript({
# Fill the system memory so that it can be seen in the Task Manager.
$Array += $Array
$Array
# Closing the Process, which should close the RunSpace, but this does not happen.
$Powershell.Runspace.Dispose()
$PowerShell.Dispose()
})
$Async = $PowerShell.BeginInvoke()
# Other jobs in the main thread...
Второй сценарий представляется более правильным, если судить по системной памяти. Однако, конечно, это не применимо в жизни, так как Start-Sleep 10
останавливает основной процесс.
$Array = 1..10000
$PowerShell = [PowerShell]::Create()
$RunSpace = [Runspacefactory]::CreateRunspace()
$RunSpace.Open()
$RunSpace.SessionStateProxy.SetVariable('Array', $Array)
$PowerShell.Runspace = $RunSpace
[void]$PowerShell.AddScript({
# Fill the system memory so that it can be seen in the Task Manager.
$Array += $Array
$Array
})
$Async = $PowerShell.BeginInvoke()
Start-Sleep 10
$PowerShell.EndInvoke($Async) | Out-Null
$PowerShell.RunSpace.Dispose()
$PowerShell.Dispose()
# Other jobs in the main thread...
Пожалуйста, напишите мне правильный способ закрыть RunSpace по завершении. Спасибо тебе