簡體   English   中英

運行空間中的Register-ObjectEvent

[英]Register-ObjectEvent from runspace

我有一個條形碼掃描腳本。 它會打開“ DataReceived”上的手持掃描器注冊對象事件的RS323端口,並運行一個腳本塊以更新數據庫字段。

這一切都正常運行時(從主線程),但是現在我想從運行空間執行相同操作,並將條形碼返回到主線程。 這樣我就不會阻塞正在運行的線程。

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

您可以使用同步的哈希表存儲結果數據,這將使您可以從父運行空間查看數據

$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訪問結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM