1

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

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

在此处输入图像描述

黄色是我的应用程序启动的进程,红色是这个进程自己启动的“长”线程(注意它们的地址从 DLL 开始!)。

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

通常,正如您从图像中看到的那样,线程的总数为 43,而线程的大小myprocess.Threads为 30。

4

1 回答 1

1

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

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

要识别属于特定进程的线程,请在枚举线程时将其进程标识符与 THREADENTRY32 结构的 th32OwnerProcessID 成员进行比较。

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

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

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

于 2019-12-05T22:06:59.590 回答