Register-ObjectEvent из пространства выполнения - PullRequest
0 голосов
/ 22 февраля 2019

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

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

$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()

1 Ответ

0 голосов
/ 22 февраля 2019

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

$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

...