Почему поток, созданный PowerShell, не может выполнять функции сценария? - PullRequest
3 голосов
/ 08 мая 2019

У меня есть функция скрипта, которая вызывает. сеть для манипулирования текстовыми документами. Оно работает. Теперь я хочу создать подпоток для его выполнения, а затем основной поток решает, завершит ли он указанное время или превышает его, и завершает его после этого времени. Как показано в коде, он не выполняет функции в блоке кода $ node, но вместо этого $ task1 выполняет командлет. Это почему? Как я могу удовлетворить свои потребности?

try{
# $cb is a instance of class,scan is the function I want to invoke.
    $code = { $cb.Scan($PrepareFileName, $NailDirName, $HtmlFileName) }
#    $task1 = { Start-Sleep -Seconds 9; Get-Service }
    $newThread = [PowerShell]::Create().AddScript($code)
    $handleTh = $newThread.BeginInvoke()
    $nTimes = 0;
    do
    {
        $nTimes++;
        if($handleTh.IsCompleted -or $nTimes -gt 10)
        {
          break;  
        }
        Start-Sleep -Milliseconds 500

    } while($true)

    $newThread.EndInvoke($handleTh)
    $newThread.Runspace.Close()
    $newThread.Dispose()

}catch{

}

1 Ответ

0 голосов
/ 08 мая 2019

Вам необходимо создать runspace и его для объекта PowerShell.Проверьте это microsoft"учебное пособие" для правильного использования пространств выполнения.Ссылка также объясняет, как использовать пулы пространства выполнения и аргументы блока скриптов.

try{
    # $cb is a instance of class,scan is the function I want to invoke.
    $code = { 
        # Update 1, added parameter
        param($cb)
        $cb.Scan($PrepareFileName, $NailDirName, $HtmlFileName) 
    }
    # Create a runspace
    $runspace = [runspacefactory]::CreateRunspace()
    # Update 1, inject parameter
    $newThread = [PowerShell]::Create().AddScript($code).AddParameter(‘cb’,$callback)

    # Add the runspace
    $newThread.Runspace = $runspace
    $runspace.Open()
    $handleTh = $newThread.BeginInvoke()
    $nTimes = 0;
    do
    {
        $nTimes++;
        if($handleTh.IsCompleted -or $nTimes -gt 10)
        {
          break;  
        }
        Start-Sleep -Milliseconds 500

    } while($true)

    $newThread.EndInvoke($handleTh)
    $newThread.Dispose()
}
catch{
}

Надеюсь, это поможет.

enter image description here

...