Register-ObjectEvent из области выполнения

У меня есть скрипт сканирования штрих-кода. он открывает порт RS323 для ручного сканера, событие Register-objects на «DataReceived» запускает блок сценария действия для обновления полей базы данных.

все это работает при нормальной работе (из основного потока), но теперь я хотел бы сделать то же самое из пространства выполнения и вернуть штрих-код в основной поток. таким образом я бы не блокировал работающий поток.

$bcHandler =[runspacefactory]::CreateRunspace()

# set Single Threaded Apartment and reuse thread
$bcHandler.ApartmentState = "STA"
$bcHandler.ThreadOptions = "ReuseThread"      
# Open the runspace
$bcHandler.Open()

$psCmd = [PowerShell]::Create().AddScript({
    Param($ComPort="COM3")

    $port= new-Object System.IO.Ports.SerialPort $ComPort,9600,None,8,one

    Register-ObjectEvent -InputObject $port -EventName "DataReceived" -SourceIdentifier $port.PortName -Action {

        # start stopwatch for perforance measurements
        $StopWatch = [System.Diagnostics.Stopwatch]::StartNew()

        # Read scanner buffer
        $Result = ($port.ReadExisting() | Out-String).Trim()

        # Send beep to handheld scanner
        $port.Write([char]7,0,1)
    }
})


# Open the runspace
$psCmd.Runspace = $bcHandler
$Handler = $psCmd.BeginInvoke()

person Proxx    schedule 22.02.2019    source источник


Ответы (1)


Вы можете использовать синхронизированную хеш-таблицу для хранения данных результата, что позволит вам видеть данные из родительского пространства выполнения.

$Global:syncHash = [hashtable]::Synchronized(@{})

$bcHandler =[runspacefactory]::CreateRunspace()

# set Single Threaded Apartment and reuse thread
$bcHandler.ApartmentState = "STA"
$bcHandler.ThreadOptions = "ReuseThread"   
# Open the runspace
$bcHandler.Open()
#Synch the HashTable between runspaces
$bcHandler.SessionStateProxy.SetVariable("syncHash", $syncHash)

$psCmd = [PowerShell]::Create().AddScript({
    Param($ComPort="COM3")

    $port= new-Object System.IO.Ports.SerialPort $ComPort,9600,None,8,one

    Register-ObjectEvent -InputObject $port -EventName "DataReceived" -SourceIdentifier $port.PortName -Action {

        # start stopwatch for perforance measurements
        $StopWatch = [System.Diagnostics.Stopwatch]::StartNew()

        # Read scanner buffer
        $syncHash.Result = ($port.ReadExisting() | Out-String).Trim()

        # Send beep to handheld scanner
        $port.Write([char]7,0,1)
    }
})


# Open the runspace
$psCmd.Runspace = $bcHandler
$Handler = $psCmd.BeginInvoke()

Затем вы можете получить доступ к результату, используя $syncHash.Result

person Shamus Berube    schedule 22.02.2019
comment
Я знаю о синхронизированных хэш-таблицах, проблема в том, что изменение значения в синхронизированной хэш-таблице не запускает событие или действие в другом пространстве выполнения ... поэтому мне нужно опросить хеш-таблицу на предмет изменений, я не думаю, что это отличное решение. - person Proxx; 25.02.2019