PowerShell: пространство выполнения и делегаты
Я пытаюсь улучшить скорость моего сценария Exchange Online, используя пробелы. Моя проблема в том, что скрипт-блок не может вызвать Get-MailboxFolderStatistics
потому что этот командлет предоставляется модулем Exchange Online.
Поэтому я попытался использовать делегата, см. Следующий пример кода.
function getData() {
param(
[Parameter(Mandatory)]
[int]
$Number,
[Parameter(Mandatory)]
[Func[int, System.Object]]
$func_GetMailboxFolderStatistics
)
$result = $func_GetMailboxFolderStatistics.Invoke($Number)
"test -> $result"
}
$runspacePool = [RunspaceFactory]::CreateRunspacePool(1, 20)
$runspacePool.Open()
$asyncJobs = @()
$n = 0
[Func[int, System.Object]] $func = {
param($num)
Start-Sleep 5
"$num +++> $num"
}
0..3 | ForEach-Object {
$thread = [powershell]::Create()
[void]$thread.AddScript($function:getData)
[void]$thread.AddArgument($_)
[void]$thread.AddArgument($func)
$thread.RunspacePool = $runspacePool
$asyncJobs += New-Object PSObject -Property @{
RunNum = $n
Pipe = $thread
Result = $thread.BeginInvoke()
}
$n++
}
do {
Write-Host "." -NoNewline
Start-Sleep -Seconds 1
}
while ( $asyncJobs.Result.IsCompleted -contains $false )
Write-Host "All jobs completed!"
$outcome = foreach($job in $asyncJobs){ $job.Pipe.EndInvoke($job.Result) }
$outcome
Идея в том, что я звоню Get-MailboxFolderStatistics
внутри моего делегата. Это на самом деле работает, но кажется, что мой код выполняется синхронно, а не в асинхронном режиме, который я вызываю .Invoke