【问题标题】:ProcessThreads' TotalProcessorTime does not match Process'sProcessThreads 的 TotalProcessorTime 与 Process 的不匹配
【发布时间】:2011-12-07 09:00:26
【问题描述】:

我目前正在尝试监控我的项目的性能。当我枚举所有物理线程 (Process.GetCurrentProcess().Threads) 时,处理器花费的总时间远低于进程本身的总处理器时间。线程数量稳定,几乎没有我可以错过的线程(可能直到我打开监控窗口)。这是为什么呢?

我也遇到了 InvalidOperationException 的问题:线程已经退出(当我读取 TotalProcessorTime 时)。但是,当我查找线程的状态时,它是 Waiting。如何规避异常?

谢谢

【问题讨论】:

  • 任何已终止的线程都不会包含在您的枚举中,但它们的处理器使用情况会影响总进程数。
  • @RaymondChen:我是在应用程序启动后立即开始监控的,所以我怀疑任务在我开始监控之前终止会造成如此巨大的差异。

标签: c# multithreading winapi


【解决方案1】:

.Net 框架和操作系统创建和破坏了许多您无法控制的线程。

例如垃圾收集器可以使用多个线程。当您调用 Win32 API(.Net 框架可能会为您执行此操作)时,这些也可以触发短期线程。

【讨论】:

  • 你说Process.Threads不包含所有底层线程?我知道我无法控制线程,ProcessThread 只是提供一些信息。来自 MSDN:“使用 ProcessThread 获取与当前进程关联的所有线程。”如果你是对的:WinAPI 可以显示所有线程吗?
  • 短期线程是可能的解释,但对我来说似乎很奇怪,我从来没有抓住任何一个。此外,该应用程序正在运行一些重计算托管线程,我想知道操作系统是否每秒都会产生物理线程并重新定位逻辑线程。
猜你喜欢
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
相关资源
最近更新 更多