Темы в Powershell - PullRequest
       7

Темы в Powershell

0 голосов
/ 06 февраля 2020

У меня есть базовый c скрипт для генерации Windows формы. В этом сценарии кнопка должна запускаться и работать. Чтобы предотвратить отставание, я хотел бы использовать несколько потоков.

После прочтения нескольких руководств я все еще не понимаю основы этого. Это моя функция для нажатия кнопки:

Function Click ()
{
    Get-Job | Remove-Job
    $MaximumThreads = 4
    For ($i=0;$i -lt 5; $i++)
    {
        $ScriptBlock =
        {
            Write-Host "Job started!"
        }
        While ($(Get-Job -state running).count -ge $MaximumThreads)
        {
            Write-Host "Wait"
            Start-Sleep -Seconds 1
        }
        Start-Job -ScriptBlock $ScriptBlock
    }
    Write-Host "All jobs complete!"
}

Я получаю такой вывод:

Wait
Wait
Wait
Wait
Wait
Wait
All jobs complete!
Cancel

Я ожидаю, что первые потоки начнут накапливаться до тех пор, пока не будет достигнут порог возникнет условие «Ожидание». Но создается впечатление, что Джобс вообще не запускается, и это заставляет меня поверить, что я упускаю что-то фундаментальное ...

Есть предложения? Спасибо!

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

В вашем коде вы создаете задания в al oop, а внутри того же l oop вы ждете, пока они завершатся через некоторое время l oop. Только после этого, пока l oop, вы запускаете задание.

Попробуйте:

function Click {
    Get-Job | Remove-Job
    $MaximumThreads = 4
    # create and start the jobs
    for ($i = 0; $i -lt $MaximumThreads; $i++) {
        $ScriptBlock = { Write-Host "Job started!" }
        # Start-job outputs job information. 
        # If you don't want that, append | Out-Null
        Start-Job -ScriptBlock $ScriptBlock
    }
    # now wait for the jobs to complete.
    while ((Get-Job -State Completed).Count -lt $MaximumThreads) {
        Write-Host "Wait"
        Start-Sleep -Seconds 1
    }
    Write-Host "All jobs complete!"
}

Click

Вывод:

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command                  
--     ----            -------------   -----         -----------     --------             -------                  
41     Job41           BackgroundJob   Running       True            localhost             Write-Host "Job start...
43     Job43           BackgroundJob   Running       True            localhost             Write-Host "Job start...
45     Job45           BackgroundJob   Running       True            localhost             Write-Host "Job start...
47     Job47           BackgroundJob   Running       True            localhost             Write-Host "Job start...
Wait
All jobs complete!
0 голосов
/ 06 февраля 2020

Я думаю, вам нужно переместиться за пределы фор-л oop.

Function Click()
{
    Get-Job | Remove-Job
    $MaximumThreads = 4
    For ($i=0;$i -lt 5; $i++)
    {
        $ScriptBlock =
        {
            Write-Host "Job started!"
        }
        Start-Job -ScriptBlock $ScriptBlock
    }

    While ($(Get-Job -state running).count -ge $MaximumThreads)
    {
        Write-Host "Wait"
        Start-Sleep -Seconds 1
    }

    Write-Host "All jobs complete!"
}
...