我有一个基于 3.5 构建的多线程 wpf 应用程序。当我通过 Process Explorer 查看正在运行的线程时,我看到 8 个线程都具有相同的起始地址 ntdll.dll!RtlUserThreadStart,并且所有 8 个线程的 CPU 值都在 3-6+ 之间,并且具有较高的 Cycles Delta。我无法弄清楚这些线程在做什么。它总是相同的线程。它永远不会在应用程序的同一实例中发生变化。当我同时调试我的应用程序并暂停调试器时,所有这些线程都为堆栈显示一行 System.Threading.ConcurrencyScheduler.Scheduler.WaitForWork() 或 System.Threading.Monitor.Wait()。
我为 Visual Studio 启用了符号文件,我在这些线程上看到了以下堆栈:
System.Threading.Monitor.Wait() Normal
mscorlib.dll!System.Threading.Monitor.Wait(object obj, int millisecondsTimeout) + 0x19 bytes
System.Threading.dll!System.Threading.ConcurrencyScheduler.Scheduler.WaitForWork() + 0xd0 bytes
System.Threading.dll!System.Threading.ConcurrencyScheduler.InternalContext.Dispatch() + 0x74a bytes
System.Threading.dll!System.Threading.ConcurrencyScheduler.ThreadInternalContext.ThreadStartBridge(System.IntPtr dummy) + 0x9f bytes
当我查看进程监视器中线程上提供的堆栈时,我看到以下示例:
0 ntoskrnl.exe!KeWaitForMultipleObjects+0xc0a
1 ntoskrnl.exe!KeAcquireSpinLockAtDpcLevel+0x732
2 ntoskrnl.exe!KeWaitForSingleObject+0x19f
3 ntoskrnl.exe!_misaligned_access+0xba4
4 ntoskrnl.exe!_misaligned_access+0x1821
5 ntoskrnl.exe!_misaligned_access+0x1a97
6 mscorwks.dll!InitializeFusion+0x990b
7 mscorwks.dll!DeleteShadowCache+0x31ef
或者:
0 ntoskrnl.exe!KeWaitForMultipleObjects+0xc0a
1 ntoskrnl.exe!KeAcquireSpinLockAtDpcLevel+0x732
2 ntoskrnl.exe!KeWaitForSingleObject+0x19f
3 ntoskrnl.exe!_misaligned_access+0xba4
4 ntoskrnl.exe!_misaligned_access+0x1821
5 ntoskrnl.exe!KeAcquireSpinLockAtDpcLevel+0x93d
6 ntoskrnl.exe!KeWaitForMultipleObjects+0x26a
7 ntoskrnl.exe!NtWaitForSingleObject+0x41f
8 ntoskrnl.exe!NtWaitForSingleObject+0x78e
9 ntoskrnl.exe!KeSynchronizeExecution+0x3a23
10 ntdll.dll!ZwWaitForMultipleObjects+0xa
11 KERNELBASE.dll!GetCurrentProcess+0x40
12 KERNEL32.dll!WaitForMultipleObjectsEx+0xb3
13 mscorwks.dll!CreateApplicationContext+0x10499
14 mscorwks.dll!CreateApplicationContext+0xbc41
15 mscorwks.dll!StrongNameFreeBuffer+0xc54d
16 mscorwks.dll!StrongNameFreeBuffer+0x2ac48
17 mscorwks.dll!StrongNameTokenFromPublicKey+0x1a5ea
18 mscorwks.dll!CopyPDBs+0x17362
19 mscorwks.dll!CorExitProcess+0x3dc9
20 mscorwks.dll!TranslateSecurityAttributes+0x547f
21 mscorlib.ni.dll+0x8e6bc9
作为该项目的附加说明。我的电脑是一个4核的单CPU。当我们在具有 4 个内核的双 CPU 上运行相同的应用程序时,我们会看到线程数从 8 个变为 16 个。