Запустить метод async - PullRequest
       3

Запустить метод async

0 голосов
/ 29 июня 2018

Я пытаюсь выполнить некоторые из моих пользовательских кодов асинхронно в Powershell . Следующее пытается проверить наличие обновлений в фоновом потоке:

Function CheckUpdates($manager)
{
    . "$PSScriptRoot\..\commands\upgradecmd.ps1";

    $upgradeCmd = New-Object UpgradeCmd -ArgumentList $manager;
    [bool]$upgradesAvailable = $false;

    try
    {
        $Global:silentmode = $true;

        $upgradeCmd.preview = $true;

        Start-Job -ArgumentList $upgradeCmd -ScriptBlock { param($upgradeCmd) $upgradeCmd.Run(); };

        Get-Job | Receive-Job;

        $upgradesAvailable = $upgradeCmd.upgradesAvailable;
    }
    finally
    {
        $Global:silentmode = $false;
    }

    if ($upgradesAvailable)
    {
        WriteWarning "Upgrades detected.";
        WriteWarning "Please, run the upgrade command to update your Everbot installation.";
    }
}

Проблема в том, что внутри задания (в ScriptBlock ) PS ничего не узнает о моем пользовательском методе "Run ()", поэтому он не знает, как его вызвать. Я попытался «включить» класс в работу, используя параметр -InitializationScript с небольшим успехом.

После поиска в Интернете кажется, что способ сделать это - использовать PS Jobs , в PS нет обработки потоков или что-то вроде "async". Дело в том, что я просто хочу запустить метод некоторого класса моего кода PS асинхронно.

1 Ответ

0 голосов
/ 29 июня 2018

Почему бы вам не указать источник внутри блока скриптов?

Function CheckUpdates($manager)
{
    try
    {
        $Global:silentmode = $true

        $Scriptblock = {
            param($manager)
            . "<absolutepath>\upgradecmd.ps1"; #better to replace this with absolute path
            $upgradeCmd = New-Object UpgradeCmd -ArgumentList $manager;
            [bool]$upgradesAvailable = $false
            $upgradeCmd.preview = $true
            $upgradeCmd.Run()
            $upgradesAvailable = $upgradeCmd.upgradesAvailable;

            Return $upgradesAvailable
        }
        Start-Job -ArgumentList $manager -ScriptBlock $Scriptblock
        $upgradesAvailable = @(Get-Job | Wait-Job | Receive-Job) #This will probably not be so cut and dry but you can modify your code based on the return value
    }
    finally
    {
        $Global:silentmode = $false;
    }

    if ($upgradesAvailable)
    {
        WriteWarning "Upgrades detected.";
        WriteWarning "Please, run the upgrade command to update your Everbot installation.";
    }
}

Я также добавил Wait-Job перед его получением, чтобы ваш скрипт ожидал завершения заданий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...