睡觉(10)什么都不做?

Dan*_*dor 1 .net multithreading web-services remote-desktop

我的网络服务有一个奇怪的情况.

这是一个简单的 - 它创建一个不断运行的线程,在后台进行一些磁盘检查,对于它执行的每个File.Exists,它进入Sleep(10),因此它不会占用所有的CPU核心.

这一切都很好,直到我从RDP登录.当我这样做时,这个线程会飙升并消耗尽可能多的东西.

在这里,看看......

我有两个核心,我的前台应用程序使用大约18%的CPU(在NOW-meter上显示了whis).左侧是没有人登录时的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);
}
Run Code Online (Sandbox Code Playgroud)

小更新:

Sleep(1000)当代码作为Windows服务运行并且没有人连接到机器时,即使没有.我正式宣布它为WTF.

Rem*_*anu 5

别睡觉 将线程优先级设置为IDLE.

接下来要确定每个进程的CPU消耗,因此不要追逐红鲱鱼.打开Perfmom.exe并查看Process(*)\(*)对象(所有实例).然后你可以检查% Processor Time% User Time 每一个过程,并确定使用18%谁是当RDP被关闭.

作为旁注,而不是shuffling same directories over and over again,为什么不使用更改通知机制呢?