C# 线程不包含进程生成的线程的完整列表

C# 线程不包含进程生成的线程的完整列表,c#,multithreading,process,process-explorer,C#,Multithreading,Process,Process Explorer,我的应用程序启动一个辅助进程(存储在文件系统中的exe文件)。然后,该过程生成多个线程,这些线程执行长时间的多核操作 我可以从ProcessExplorer中看到此进程启动的线程列表: 黄色表示应用程序启动的进程,红色表示该进程自行启动的“长”线程(请注意,它们的地址从DLL开始!) 在我的C#代码中,我希望看到所有这些线程都使用属性(其中myprocess是我的应用程序启动的进程)。相反,我看到的是线程ID 18160和其他线程,但不是以红色突出显示的线程。为什么? 通常,正如您从图像中看到

我的应用程序启动一个辅助进程(存储在文件系统中的exe文件)。然后,该过程生成多个线程,这些线程执行长时间的多核操作

我可以从ProcessExplorer中看到此进程启动的线程列表:

黄色表示应用程序启动的进程,红色表示该进程自行启动的“长”线程(请注意,它们的地址从DLL开始!)

在我的C#代码中,我希望看到所有这些线程都使用属性(其中
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));
}