2011-06-09 41 views
1

我的托管服务提供商给了我50%的cpu限制。我正在尝试使用DotNetZip来备份我的DNN门户文件 - 超过16000个600Mb磁盘空间文件的集合。我正在使用压缩优先级最低的单独线程。如果处理器加载足够,那么我的线程可以正常工作,但是当处理器或多或少空闲时,我会快速丰富我的CPU限制(50%),最后池会终止并需要回收。如何在长时间ASP.NET计算期间避免App Pool终止?

所以我需要一个想法,我可以减慢线程,以便不超过cpu限制。

谢谢。

+0

将一个Thread.Sleep(500)之间的每个文件的工作? – 2011-06-09 18:31:00

+0

当然会的,但是它可能会在几个小时内变得太慢 - 通过ftp备份更容易。 – mishau 2011-06-09 20:39:14

回答

1

如果您只是想保持线程利用率低于50%,请在整个代码中添加Thread.Sleep(x)。你需要弄清楚你需要多少这些,以及毫秒延迟应该是多少 - 只有当你编写需要Sleep()调用的代码时...

这就是说,你的情况听起来很奇怪。应该有更好的方法来进行备份。

+0

因此,睡眠是唯一的方法。我正在考虑一个计算延迟时间的公式,这个延迟时间取决于在总空间1Gb内处理的字节速度。每发送一部分字节,它就会计算速度,如果速度高于某个限制,它将被延迟纠正。 – mishau 2011-06-09 20:36:18

+0

@mishau:如果框上的安全性允许您这样做,您可能需要使用性能计数器。 – 2011-06-09 21:17:24

0

最简单的方法可能是定期抛出Sleep,并指定了足够的时间以便线程无法运行,即使没有其他运行准备就绪,它也只能使用一个核心的一半。

0
workerThread.Suspend() 
Thread.Sleep (500); 
workerThread.Resume(); 

小心,但。注意,如果工作线程处于关键部分而暂停它时,则可能导致死锁或意外减速。欲了解更多信息: MSDN System.Threading.Thread.Suspend

+0

自.NET 2.0以来暂停/恢复已过时。而Thread.Sleep()冻结了它被调用的线程(根据我的测试)。 – mishau 2011-06-11 18:21:58