我的Web服务遇到一个奇怪的情况。
这是一个简单的例子-它创建了一个持续运行的线程,在后台对磁盘进行了一些磁盘检查,对于每个文件,它执行后都会进入Sleep(10),因此不会消耗所有CPU内核。
一切正常,直到我从RDP登录。当我这样做时,该线程将峰值并消耗尽可能多的内存。
在这里,看看...
我有两个核心,我的前台应用使用了大约18%的CPU(这在NOW-meter上显示)。左侧是没有登录时的CPU使用率。
到底是怎么回事?还有更多-在这种情况下如何适本地节制线程?
我的代码段产生了这个问题:
foreach (string fi in files)
{
if (_shouldStop)
{
break;
}
lock (_workItems)
{
StatusString = string.Format("Examining file Dir={0}\nmask={1}\nfile={2}\nqueue={3}",
root, mask, fi, _workItems.Count);
}
lock (_workItems)
{
if (!_workItems.Contains(fi))
{
if (!File.Exists(TargetForFile(fi + ".hash")))
{
StatusString = string.Format("Adding file Dir={0}\nmask={1}\nfile={2}\nqueue={3}",
root, mask, fi, _workItems.Count);
_workItems.Add(fi);
}
}
}
Thread.Sleep(10);
}
小更新:
当代码作为Windows服务运行并且没有人连接到计算机时,即使
Sleep(1000)
也不执行任何操作。我正式宣布它为WTF。
最佳答案
sleep 10仅为10毫秒-因此您真的接近屈服并重新开始工作。
我的猜测是,当您登录时,已经发生了足够的事情,因此您的线程不会立即重新安排,因此它实际上最终会处于闲置状态超过10毫秒(而且我认为我读到的最大分辨率为 sleep 是100米尔,顺便说一句)。但是,当您不使用RDP时,该线程变得可用于更频繁地重新调度,因此会消耗更多的CPU。
要进行测试,请尝试将您的 sleep 时间增加到500(0.5秒)或1000左右,以使您有明显的 sleep 时间。
另一个测试是在“什么都不做”循环中丢弃另一个线程,并在强制CPU繁忙时查看您的file.exists线程是否适本地屈服。
关于.net - Sleep(10)什么都不做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8439502/