RunspacePool行为

时间:2017-03-19 20:16:32

标签: multithreading powershell

鉴于这里的代码,这是为我的编码标准修改的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

0 个答案:

没有答案