Tarefas em segundo plano podem tornar seu fluxo de trabalho assíncrono.
-
Converta a função de ativação em um bloco de script:
$WakeUp = { ([string] $url) try { # Processing... } catch { throw $_ } }
-
Para cada URL, gire o bloco de script como um trabalho em segundo plano.
@( "http://app1" # More... ) | % { Start-Job -ScriptBlock $WakeUp -ArgumentList $_ }
Confira meu responda a partir de outra pergunta para ver como você pode receber dados do trabalho em segundo plano e detectar quais falharam.
Atualizar
Isso resolve o problema em sua versão sobre não receber saída. Você deseja usar Wait-Job
antes de Receive-Job
para permitir que eles sejam concluídos porque estão sendo executados de forma assíncrona.
$WakeUp = {
param ([string] $url)
try {
Write-Output "Waking up $url ..."
Start-Sleep -Seconds 3
if ($url -eq "http://app2/") {
throw ($url + " failed")
}
Write-Output "$url Ok"
} catch {
throw $_
}
}
$jobs = @()
# Run your code that needs to be elevated here
@(
"http://app1/",
"http://app2/",
"http://app3/"
) | % {
$jobs += Start-Job -ScriptBlock $WakeUp -ArgumentList $_
}
Wait-Job -Job $jobs | Out-Null
Receive-Job -Job $jobs -Keep