如何知道线程是否被垃圾收集阻止

时间:2014-11-13 21:04:54

标签: c# garbage-collection .net-3.5 session-timeout

我在后端有一个带有SQL服务器的客户端 - 服务器应用程序。

我正在运行一些资源密集型任务(大约需要30个小时才能完成)。用户有3分钟的会话时间。我每隔2分钟就会有一个单独的主题更新会话。

但是,偶尔会暂停线程,因为垃圾收集器会激活并阻塞线程。因为当线程被唤醒时,会话已经过期,所以我无法完成任务。

我正在为我的流程使用Workstation Concurrent设置。

有关解决此问题的任何建议吗?

在一个测试中,我有一个.NET计时器设置为在我的任务期间每2分钟调用一次回调。但是,我逐渐看到计时器在2分1秒,2分2秒内发射,有时会有超过一分钟的延迟。

2 个答案:

答案 0 :(得分:1)

如果您愿意切换到服务器GC(从讨论中看起来像一个可行的选项),您可以使用GC通知API:

http://msdn.microsoft.com/en-us/library/system.gc.waitforfullgcapproach.aspx

然后,您将能够在GC完全启动之前收到通知 - 这会导致暂停。

答案 1 :(得分:0)

您可以使用延迟模式设置告诉垃圾收集器在关键操作期间不运行。

http://www.infoq.com/news/2012/03/Net-403

http://msdn.microsoft.com/en-us/library/bb384202(v=vs.110).aspx