如何获取RunspacePool中当前代码执行所属的Runspace实例
实现方法
在Runspace内部执行的脚本块中,调用线程静态属性 [System.Management.Automation.Runspaces.Runspace]::DefaultRunspace 即可直接获取当前运行脚本所属的Runspace实例,该属性是线程隔离的,不同并行Runspace拿到的都是自身的实例,不会出现取值错乱的问题。
你可以通过该实例的 InstanceId 属性(GUID格式)作为唯一标识,区分不同的Runspace,修改后的完整代码如下:
param ( $MaxRunspaces = 4, $JobCount = 20 ) try { $pool = [RunspaceFactory]::CreateRunspacePool(1, $MaxRunspaces) $pool.Open() $jobs = 1..$JobCount | foreach { $taskId = $_ $ps = [PowerShell]::Create() $ps.RunspacePool = $pool [void]$ps.AddScript({ param($taskId) # 获取当前Runspace实例 $currentRunspace = [System.Management.Automation.Runspaces.Runspace]::DefaultRunspace # 输出任务ID和对应的Runspace唯一标识 return [PSCustomObject]@{ TaskId = $taskId RunspaceId = $currentRunspace.InstanceId ThreadId = [Threading.Thread]::CurrentThread.ManagedThreadId } }).AddArgument($taskId) [PSCustomObject]@{ PowerShell = $ps AsyncResult = $ps.BeginInvoke() } } # 输出所有任务的所属Runspace信息 $jobs | foreach { $_.PowerShell.EndInvoke($_.AsyncResult) $_.PowerShell.Dispose() } | Format-Table -AutoSize } finally { $pool.Dispose() }
关键说明
- 运行上述代码后你会看到,总计20个任务只会分配到4个不同的RunspaceId下,符合你设置的MaxRunspaces=4的配置,验证了取值的正确性
DefaultRunspace是PowerShell Runtime内置的线程静态属性,不需要额外引入依赖,所有PowerShell版本都支持该调用- 除了InstanceId,你也可以根据需要获取Runspace的其他属性,比如
ApartmentState、RunspaceStateInfo等做状态跟踪
内容的提问来源于stack exchange,提问作者marsze
相关产品推荐
相关产品推荐

