Process.Threads 不包含进程生成的线程的完整列表

Process.Threads does not contain the full list of threads spawned by a process

我的应用程序启动了一个辅助进程(一个存储在文件系统中的 exe 文件)。然后这个进程产生几个执行长操作多核的线程。

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

黄色表示我的应用程序启动的进程,红色表示此进程自行启动的 "long" 个线程(注意它们的地址从 DLL 开始!)。

在我的 C# 代码中,我希望看到所有这些线程都使用 myprocess.Threads 属性(其中 myprocess 是我的应用启动的进程)。相反,我看到了线程 ID 18160 和其他线程, 但不是以红色突出显示的那些 。为什么?

一般来说,如图所示,线程总数为 43,而 myprocess.Threads 的大小为 30。

Process.Threads returns 与此进程关联的所有线程的实现,但它们可能是此进程不一定拥有 的线程。

Process.Threads 使用 CreateToolHelp32Snapshot 收集有关 Win32 的信息。 CreateToolHelp32Snapshot 的文档说:

To identify the threads that belong to a specific process, compare its process identifier to the th32OwnerProcessID member of the THREADENTRY32 structure when enumerating the threads.

填充 Process.Threads 的代码不检查 th32OwnerProcessID;它只是枚举所有线程。可以看到代码here:

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));
}

因此,我假设您还看到了其他进程拥有但与您的子进程关联的线程。