【发布时间】:2014-11-13 21:04:53
【问题描述】:
我有一个客户端-服务器应用程序,后端带有 SQL 服务器。
我正在运行一些资源密集型任务(大约需要 30 小时才能完成)。用户有 3 分钟的会话时间。每 2 分钟我就有一个单独的线程更新会话。
但是,有时线程会暂停,因为垃圾收集器会激活并阻塞线程。因为这个到线程唤醒的时候会话已经过期了,所以我无法完成我的任务。
我正在为我的进程使用工作站并发设置。
对解决这个问题有什么建议吗?
在一项测试中,我设置了一个 .NET 计时器,在我的任务期间每 2 分钟调用一次它的回调。但是,我逐渐看到计时器在 2 分 1 秒、2 分 2 秒内触发,有时会延迟超过一分钟。
【问题讨论】:
-
线程偶尔会暂停,因为垃圾收集器会激活并阻塞线程。 您的语句是否由您对进程所做的分析支持,或者您是否假设GC是你的问题吗?这听起来完全不合理。
-
GC 阻塞线程超过 1 分钟?从来没有听说过。没有办法降低吗?在双 1.8GHZ 上,检查 5000 万个对象需要 3.5 秒,如果所有对象都需要清理则只需 2 秒。你分配了多少对象?你确定是因为GC吗?
-
GC 不应该是阻止你线程一整分钟的原因..这是不可想象的..你的问题很可能是 CPU 不足。
-
他们都怎么说^
-
通过将 GC 设置从 Workstation Concurrent 更改为 Server 设置,我可以将运行时间降低到原来的 20%。这就是为什么我认为 GC 是罪魁祸首。
标签: c# garbage-collection .net-3.5 session-timeout