为什么应用程序不断打开新线程而不是重用池中的线程

时间:2017-11-06 10:24:28

标签: .net multithreading windbg

我有一个Windows服务,它在一个单独的线程中运行数据库任务(How to diagnose why a Threadstatic connection is not garbage collected中有更详细的描述)。该服务应该一次只运行一个后台线程。据观察,该服务不会正确释放资源(尤其是数据库连接)。我已经分析了内存转储,并且有越来越多的空闲线程:

!ThreadPool
CPU utilization: 0%
Worker Thread: Total: 65 Running: 0 Idle: 65 MaxLimit: 1023 MinLimit: 4
Work Request in Queue: 0
--------------------------------------
Number of Timers: 1
--------------------------------------
Completion Port Thread:Total: 1 Free: 1 MaxFree: 8 CurrentLimit: 1 MaxLimit: 1000 MinLimit: 4

主题列表(缩短):

!threads
ThreadCount:      80
UnstartedThread:  0
BackgroundThread: 70
PendingThread:    0
DeadThread:       8
Hosted Runtime:   no
                                                                         Lock  
       ID OSID ThreadOBJ    State GC Mode     GC Alloc Context  Domain   Count Apt Exception
   0    1 34e8 005c0d98     2a020 Preemptive  00000000:00000000 005bb308 0     MTA 
   2    2 1308 005ce540     2b220 Preemptive  00000000:00000000 005bb308 0     MTA (Finalizer) 
   3    6 2580 00659908   102a220 Preemptive  00000000:00000000 005bb308 0     MTA (Threadpool Worker) 
   5    7 1130 00698cc8   202b020 Preemptive  100EFE68:00000000 005bb308 0     MTA 
   8   10 3540 04133f00   202b220 Preemptive  0FE8EFC4:00000000 005bb308 1     MTA 
  11   20 3518 09253c30   1020220 Preemptive  00000000:00000000 005bb308 0     Ukn (Threadpool Worker) 
  12   14 44e4 0dc8e5c0   1029220 Preemptive  0FE8EA6C:00000000 005bb308 0     MTA (Threadpool Worker) 
  13    9 3bfc 0dc8eb08   1029220 Preemptive  0FE40EA4:00000000 005bb308 0     MTA (Threadpool Worker) 
  14   16 4328 04133470   1029220 Preemptive  0FF6CEA4:00000000 005bb308 0     MTA (Threadpool Worker) 
.....
 75   73 3b78 0e93a5b0   1029220 Preemptive  100973E0:00000000 005bb308 0     MTA (Threadpool Worker) 
  76   74 2ab4 0e93c018   1029220 Preemptive  10056368:00000000 005bb308 0     MTA (Threadpool Worker) 
XXXX   90    0 0de36520     39820 Preemptive  00000000:00000000 005bb308 0     Ukn 
XXXX   78    0 0e93aaf8   8039820 Preemptive  00000000:00000000 005bb308 0     Ukn (Threadpool Completion Port) 
XXXX   77    0 1106fa78     39820 Preemptive  00000000:00000000 005bb308 0     Ukn 
XXXX   75    0 0e93b588     39820 Preemptive  00000000:00000000 005bb308 0     Ukn 
XXXX   76    0 10d53a78     39820 Preemptive  00000000:00000000 005bb308 0     Ukn 
XXXX   80    0 0e93d538     39820 Preemptive  00000000:00000000 005bb308 0     Ukn 
  77   82 2040 1106dac8   8029220 Preemptive  00000000:00000000 005bb308 0     MTA (Threadpool Completion Port) 
XXXX   86    0 1106e010     39820 Preemptive  00000000:00000000 005bb308 0     Ukn 
XXXX   89    0 041339b8     39820 Preemptive  00000000:00000000 005bb308 0     Ukn 

线程堆栈大多数线程看起来都是一样的:

~70kB
 # ChildEBP RetAddr  Args to Child              
00 1247fbf4 75492cc7 00000268 00000000 1247fc3c ntdll!NtWaitForSingleObject+0xc
01 1247fc68 748c2396 00000268 00004e20 00000000 KERNELBASE!WaitForSingleObjectEx+0x99
02 1247fccc 748c25e7 00004e20 00000000 0e93caa8 clr!CLRSemaphore::Wait+0xc0
03 1247fd08 748c2681 00004e20 0a7a6632 748c1fe0 clr!ThreadpoolMgr::UnfairSemaphore::Wait+0x132
04 1247fd74 748d5dd1 00000000 748d5db7 748d5d80 clr!ThreadpoolMgr::WorkerThreadStart+0x389
05 1247fd90 76cf7c04 005f7c48 76cf7be0 08601cd5 clr!Thread::intermediateThreadProc+0x55
06 1247fda4 778cad2f 005f7c48 0929786d 00000000 kernel32!BaseThreadInitThunk+0x24
07 1247fdec 778cacfa ffffffff 778b00a2 00000000 ntdll!__RtlUserThreadStart+0x2f
08 1247fdfc 00000000 748d5d80 005f7c48 00000000 ntdll!_RtlUserThreadStart+0x1b

据我所知,现在是在游泳池中等待的线程。 有没有办法继续分析?线程是否以某种方式被阻止?

0 个答案:

没有答案