鉴于这里的代码,这是为我的编码标准修改的this example的改编,并使用函数而不是脚本块,我的理解是 ForEach循环运行20次,产生20个作业。 DoWhile循环等待作业完成,这取决于每个作业的休眠时间的随机数。 完成所有写入控制台的作业后。 然后从每个作业中提取结果并将其写入网格视图。
所有这些都是有道理的,但是当我运行它时,在“所有作业完成”之前需要不超过半秒(总是只有1个额外的时间段),然后在网格视图出现之前需要相当长的时间。但是,在我看来,所有工作都需要一段时间才能完成(等待Sleep完成每个工作),然后网格视图应该几乎立即填充。 那么,我的理解有什么问题,因为它与现实背道而驰?
function Sleep-Time {
Param (
[int]$runNumber
)
$sleepTime = Get-Random -Minimum 1 -Maximum 10
Start-Sleep -Seconds $sleepTime
$runResult = New-Object PSObject -Property @{
runNumber = $runNumber
sleep = $sleepTime
}
$runResult
}
$sleepFunction = (Get-Command Sleep-Time).scriptBlock
$throttle = 5
$runspacePool = [RunspaceFactory]::CreateRunspacePool(1, $throttle)
$runspacePool.Open()
$jobs = @()
ForEach ($i in 1..20) {
$job = [powershell]::Create().AddScript($sleepFunction).AddArgument($i)
$job.RunspacePool = $runspacePool
$jobs += @{
runNum = $i
pipe = $job
result = $job.BeginInvoke()
}
}
Write-Host "Waiting.." -noNewline
Do {
Write-Host "." -noNewline
Start-Sleep -seconds .25
} While ( $jobs.Result.IsCompleted -contains $false)
Write-Host "All jobs completed!"
$results = @()
ForEach ($job in $jobs) {
$results += $job.Pipe.EndInvoke($job.result)
}
$results | Out-GridView