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

0 ответов

Другие вопросы по тегам