【发布时间】:2017-01-09 12:42:15
【问题描述】:
我在 WCF 服务中遇到了问题。它会在一段时间后停止处理请求。我们已经安排了定期自动回收(几乎每小时 4 次)来临时修复它。 我从服务器获取了内存转储,似乎 1 个线程(实际上使用企业库进行日志记录)被锁定,其他线程正在等待它,但我有点困惑。
我使用 Windbg 工具来获取性能统计数据:- !threads 给了我以下数据:-
74 60 202c 000000000f1fce10 3029220 Preemptive 0000000000000000:0000000000000000 000000000252a6b0 1 MTA (Threadpool Worker) System.Messaging.MessageQueueException 00000003ffc67350
!syncblk 给了我以下信息:-
日志组件是异步的,将消息发送到 MSMQ。当外部系统异常发生时,一个线程被锁定,它显示大约 1000 个线程正在等待(syncbklk 中的 Monitorthread),所有这些都是等待进入日志记录的线程。 我不明白为什么 1 个线程被锁定拒绝其他线程,因为 MSMQ 没有被阻止,因为其他应用程序使用相同的 MSMQ 并且工作正常。 其次,日志组件只是将消息发送到 MSMQ ,我们可以认为它对实际应用程序有潜在的阻塞。 日志中使用的异步代码是:-
enter code here action = new Action<LogEntry>(Logger.Write);
IAsyncResult iAr = action.BeginInvoke(entry, CallbackHandler, action);action.EndInvoke(iar);
请就上述问题陈述提出建议。 Exception details
【问题讨论】:
标签: c# multithreading wcf msmq