[英]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.