我有一个多线程 .NET Windows 服务,它间歇性地挂起——可能每两周 24/7 运行一次。当发生挂起时,线程池完全饱和,因为对我们的自定义跟踪侦听器的调用由于某种原因开始阻塞。根据 Windbg 的说法,有问题的代码中没有任何锁,也没有任何阻塞,但它们肯定在某个地方阻塞了。堆栈上也没有任何异常。 BufferedStream.Write 代码中偶尔会遇到 Thread.Sleep(1),但我的问题是 ReOpenMetaDataWithMemory、CreateApplicationContext 和 DllCanUnloadNow 是什么意思?
ThreadPool 上几乎所有 2000 个挂起的工作线程(不是正常操作!)都有类似于以下的堆栈:
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
不是真正的答案,而是需要检查的东西......
确保您尚未在跟踪源中注册 DefaultTraceListener。
如果你不明确clear or remove the 默认跟踪监听器它可能仍然存在。这默认跟踪监听器 's 线程安全财产回报false,在这种情况下,System.Diagnostics.Trace 类会创建一个lock()周围的跟踪事件()打电话..
只是需要注意一些事情。
更多信息:
TraceListener.IsThreadSafe 属性 http://msdn.microsoft.com/en-us/library/system.diagnostics.tracelistener.isthreadsafe.aspx
IsThreadSafe 的值用于确定在写入监听器时是否使用全局锁。如果 IsThreadSafe 的值为 false,则无论 UseGlobalLock 的值如何,都将使用全局锁。仅当 IsThreadSafe 的值为 true 并且 UseGlobalLock 的值为 false 时,才不会使用全局锁。默认行为是在写入侦听器时使用全局锁。
谢谢,
亚伦
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)