【问题标题】:Is there a way to get the TID (thread id) in powershell foreach-object -parallel?有没有办法在 powershell foreach-object -parallel 中获取 TID(线程 id)?
【发布时间】:2021-08-21 15:00:49
【问题描述】:

只是想知道我是否可以像 $PID 或进程 id 一样,在 powershell 7 或 pwsh (https://github.com/PowerShell/PowerShell#-powershell) 中使用 foreach-object -parallel 获得线程 id 的 $TID。我可以运行它并在 sysinternals procexp (https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer) 中的 pwsh.exe 属性的“线程”选项卡中看到一堆带有 TID 列的线程。

 1..20 | foreach-object -Parallel { start-sleep (5*$_) } -ThrottleLimit 20

【问题讨论】:

  • 你为什么要这样做?
  • 您使用的是哪个版本的 PowerShell?当我尝试运行您的 sn-p 时出现错误:“无法使用指定的命名参数解析参数集”
  • @Dai Powershell 7 这是 pwsh。

标签: powershell foreach-object


【解决方案1】:

process ID ($PID) 不同,no automatic PowerShell variable 反映 thread ID(从 PowerShell 7.2 开始) )。

如果获取托管(相对于本机)线程 ID 就足够了,您可以使用 .NET API (System.Threading.Thread.CurrentThread):

1..2 | % -Parallel { [System.Threading.Thread]::CurrentThread.ManagedThreadId }

要获得 native 线程 ID,您需要通过 P/Invoke 特定于平台的 解决方案;例如,对于 Windows,使用 GetCurrentThreadId() WinAPI 函数:

# For Windows
Add-Type -Name WinApi -Namespace demo -MemberDefinition @'
  [DllImport("Kernel32.dll")]
  public static extern uint GetCurrentThreadId();
'@

1..2 | % -Parallel { [demo.WinApi]::GetCurrentThreadId() }

【讨论】:

    猜你喜欢
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2016-09-17
    相关资源
    最近更新 更多