.net - Sleep(10)什么都不做?

标签 .net multithreading web-services remote-desktop

我的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/

相关文章:

.net - 多 ORM 解决方案

c# - Visual Studio 2013 中的 ClickOnce 没有网页发布选项

java - Scanner 的 nextLine() 方法如何在按返回键时停止执行?

windows - 将 WinRM 与 WSDL 文件一起使用?

java - 从 Android 调用 Soap Web 服务

Java Jersey 休息服务

c# - 从 .NET Standard 2.0 库读取 app.config

c# - 盒子内容 API : Is modified_at field of parent folder updated when deleting an item from folder?

java - 用Java设计多线程矩阵

c++ - 这个 RAII 独占资源检查对象/管理器组合线程安全吗?