簡體   English   中英

RunSpacePool如何傳遞共享變量?

[英]RunSpacePool how do i pass a shared variable?

我正在嘗試創建一個線程,該線程將使用共享變量(在主會話和線程之間),並賦予線程使用主代碼中外部函數的能力

我設法通過函數供線程使用,我設法通過只讀變量。 我的問題是,如果我在線程內更改變量的值,然后嘗試從主會話讀取它-我看不到值的更改,因此無法共享。

我怎么做? 我的目標是最終擁有一個線程。

這是我的代碼:

$x = [Hashtable]::Synchronized(@{})
$global:yo
Function ConvertTo-Hex {
    #Write-Output "Function Ran"
    write-host "hi"
    $x.host.ui.WriteVerboseLine("===========")
    write-host $yo
    $global:yo = "test"
    write-host $yo
}
#endregion



ls
# create an array and add it to session state
$arrayList = New-Object System.Collections.ArrayList
$arrayList.AddRange(('a','b','c','d','e'))
 $x.host = $host
$sessionstate = [system.management.automation.runspaces.initialsessionstate]::CreateDefault()
$sessionstate.Variables.Add((New-Object System.Management.Automation.Runspaces.SessionStateVariableEntry('arrayList', $arrayList, $null)))
$sessionstate.Variables.Add((New-Object System.Management.Automation.Runspaces.SessionStateVariableEntry('x', $x, $null)))
$sessionstate.Variables.Add((New-Object System.Management.Automation.Runspaces.SessionStateVariableEntry('yo', $yo, $null)))
$sessionstate.Commands.Add((New-Object System.Management.Automation.Runspaces.SessionStateFunctionEntry -ArgumentList 'ConvertTo-Hex', (Get-Content Function:\ConvertTo-Hex -ErrorAction Stop)))
$runspacepool = [runspacefactory]::CreateRunspacePool(1, 2, $sessionstate, $Host)
$runspacepool.Open()

$ps1 = [powershell]::Create()
$ps1.RunspacePool = $runspacepool

$ps1.AddScript({
    for ($i = 1; $i -le 15; $i++)
    {
        $letter = Get-Random -InputObject (97..122) | % {[char]$_} # a random lowercase letter
        $null = $arrayList.Add($letter)
        start-sleep -s 1
    }
})

# on the first thread start a process that adds values to $arrayList every second
$handle1 = $ps1.BeginInvoke()

# now on the second thread, output the value of $arrayList every 1.5 seconds
$ps2 = [powershell]::Create()
$ps2.RunspacePool = $runspacepool

$ps2.AddScript({
     Write-Host "ArrayList contents is "
     foreach ($i in $arrayList)
     {
        Write-Host $i  -NoNewline
        Write-Host " " -NoNewline
     }
     Write-Host ""
     $global:yo = "BAH"
     ConvertTo-Hex
})


1..2 | % {
    $handle2 = $ps2.BeginInvoke()
    if ($handle2.AsyncWaitHandle.WaitOne())
    {
        $ps2.EndInvoke($handle2)
    }
    start-sleep -s 1.5
    write-host "====================" + $yo
}
write-host $yo

同步哈希表將滿足您的需求:

# Sync'd hash table is accessible between threads
    $hash = [HashTable]::Synchronized(@{})
    $hash.Parameter = "Value"

有幾種方法可以將其傳遞給新線程,我更喜歡簡單的方法:

[PowerShell]$powershell = [PowerShell]::Create()
$powershell.AddScript({
    Param
    (
        $hash
    )
    # do stuff
}).AddParameter("hash", $hash)

$powershell.BeginInvoke()

您從任一線程對哈希表執行的任何操作都將對兩個線程(以及您傳遞給該線程的任何其他數量)均可見並可見。

暫無
暫無

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

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