У меня есть многопоточная служба Windows .NET, которая периодически зависает - возможно, раз в две недели в режиме 24/7. Когда происходит зависание, пул потоков полностью насыщается, потому что вызовы нашего пользовательского tracelistener почему-то начинают блокироваться. Нет никаких блокировок в коде-нарушителе или каких-либо блокировок в соответствии с windbg, но они определенно блокируются где-то. В стеке нет никаких исключений. Существует Thread.Sleep (1), который иногда будет попадать в код BufferedStream.Write, но мой вопрос в том, что означают ReOpenMetaDataWithMemory, CreateApplicationContext и DllCanUnloadNow?
Почти у всех 2000 зависших рабочих потоков (не нормальная работа!) В ThreadPool есть стек, подобный следующему:
0:027> !dumpstack
OS Thread Id: 0x1638 (27)
Child-SP RetAddr Call Site
000000001d34df58 0000000077d705d6 ntdll!ZwDelayExecution+0xa
000000001d34df60 000006427f88901d kernel32!SleepEx+0x96
000000001d34e000 000006427f454379 mscorwks!DllCanUnloadNowInternal+0xf53d
000000001d34e080 000006427fa34749 mscorwks!CreateApplicationContext+0x41d
000000001d34e0e0 0000064280184902 mscorwks!ReOpenMetaDataWithMemory+0x1ff59
000000001d34e290 0000064280184532 Company_Common_Diagnostics!Company.Common.Diagnostics.BufferedStream.Write(Byte[], Int32, Int32)+0x1b2
000000001d34e300 00000642801831fd Company_Common_Diagnostics!Company.Common.Diagnostics.XmlRollingTraceListener+TraceWriter.Write(System.String)+0x52
000000001d34e350 00000642801b3304 Company_Common_Diagnostics!Company.Common.Diagnostics.XmlRollingTraceListener.InternalWrite(System.Text.StringBuilder)+0x3d
000000001d34e390 0000064274e9d7ec Company_Common_Diagnostics!Company.Common.Diagnostics.XmlRollingTraceListener.TraceTransfer(System.Diagnostics.TraceEventCache, System.String, Int32, System.String, System.Guid)+0xc4
000000001d34e410 00000642801b2f59 System_ni!System.Diagnostics.TraceSource.TraceTransfer(Int32, System.String, System.Guid)+0x2ec