C# 线程不包含进程生成的线程的完整列表
我的应用程序启动一个辅助进程(存储在文件系统中的exe文件)。然后,该过程生成多个线程,这些线程执行长时间的多核操作 我可以从ProcessExplorer中看到此进程启动的线程列表: 黄色表示应用程序启动的进程,红色表示该进程自行启动的“长”线程(请注意,它们的地址从DLL开始!) 在我的C#代码中,我希望看到所有这些线程都使用属性(其中C# 线程不包含进程生成的线程的完整列表,c#,multithreading,process,process-explorer,C#,Multithreading,Process,Process Explorer,我的应用程序启动一个辅助进程(存储在文件系统中的exe文件)。然后,该过程生成多个线程,这些线程执行长时间的多核操作 我可以从ProcessExplorer中看到此进程启动的线程列表: 黄色表示应用程序启动的进程,红色表示该进程自行启动的“长”线程(请注意,它们的地址从DLL开始!) 在我的C#代码中,我希望看到所有这些线程都使用属性(其中myprocess是我的应用程序启动的进程)。相反,我看到的是线程ID 18160和其他线程,但不是以红色突出显示的线程。为什么? 通常,正如您从图像中看到
myprocess
是我的应用程序启动的进程)。相反,我看到的是线程ID 18160和其他线程,但不是以红色突出显示的线程。为什么?
通常,正如您从图像中看到的,线程总数为43,而
myprocess.threads
的大小为30。进程的实现。threads返回与此进程关联的所有线程,但它们可能不一定属于此进程
Process.Threads
用于收集Win32上的信息。CreateToolHelp32Snapshot
的文档说明:
要识别属于特定进程的线程,请比较其
进程的th32OwnerProcessID成员的进程标识符
枚举线程时使用THREADENTRY32结构
但是,填充进程线程的代码不会选中th32OwnerProcessID
;它只是枚举所有线程。您可以看到以下代码:
因此,我假设您也看到其他进程拥有的线程,但与您的子进程关联。谢谢,Thread32First/Thread32Next返回ProcessExplorer列出的所有线程
if (NativeMethods.Thread32First(handleRef, thread))
{
do
{
ThreadInfo threadInfo = new ThreadInfo();
threadInfo.threadId = thread.th32ThreadID;
threadInfo.processId = thread.th32OwnerProcessID;
threadInfo.basePriority = thread.tpBasePri;
threadInfo.currentPriority = thread.tpBasePri + thread.tpDeltaPri;
threadInfos.Add(threadInfo);
}
while (NativeMethods.Thread32Next(handleRef, thread));
}