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));
}
因此,我假设您还看到了其他进程拥有但与您的子进程关联的线程。
我的应用程序启动了一个辅助进程(一个存储在文件系统中的 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));
}
因此,我假设您还看到了其他进程拥有但与您的子进程关联的线程。