You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 12:21:01