当前位置:  开发笔记 > 编程语言 > 正文

Thread.Sleep(1)在C#中有什么影响?

如何解决《Thread.Sleep(1)在C#中有什么影响?》经验,为你挑选了3个好方法。

在Windows窗体应用程序中,调用的影响Thread.Sleep(1)如下面的代码所示:

public Constructor()
{
    Thread thread = new Thread(Task);
    thread.IsBackground = true;
    thread.Start();
}

private void Task()
{
    while (true)
    {
        // do something
        Thread.Sleep(1);
    }
}

这个线程会占用所有可用的CPU吗?

我可以使用哪些分析技术来测量此线程的CPU使用率(除了任务管理器)?



1> Bob Nadler..:

如上所述,您的循环不会占用CPU.

但请注意:Windows 不是实时操作系统,因此您不会从Thread.Sleep(1)获得每秒1000次的唤醒.如果你还没有使用timeBeginPeriod来设置你的最低分辨率,你将每15毫秒唤醒一次.即使您将最小分辨率设置为1 ms,您仍然只会每3-4毫秒唤醒一次.

为了获得毫秒级别的计时器粒度,您必须使用Win32多媒体计时器(C#wrapper).


http://www.pinvoke.net/default.aspx/winmm.timeBeginPeriod根据MSDN文档,timeBeginPeriod应与timeEndPeriod调用匹配.另请注意"此功能会影响全局Windows设置." 并可能影响系统性能.

2> Frederick Th..:

不,它不会占用CPU,它会暂停你的线程至少那么久.当您的线程暂停时,操作系统可以安排另一个不相关的线程来使用处理器.


在现代CPU上,与使用i ++相比,1ms的睡眠是永恒的.

3> Jorge Córdob..:

Thread.Sleep(1)如上所述不会占用CPU.

以下是线程休眠时(或多或少)发生的情况:

Thread.Sleep被转换为系统调用,进而触发陷阱(允许操作系统控制的中断)

操作系统检测到睡眠调用并将您的线程标记为已阻止.

在内部,操作系统会保留一个需要唤醒的线程列表以及何时应该被唤醒.

由于线程不再使用CPU OS ...

如果父进程没有用完所有时间片,则OS将调度该进程的另一个线程以供执行.

否则,另一个进程(或空闲进程)将开始执行.

当时间到期时,您的线程将再次被安排执行,这并不意味着它将自动开始执行.

最后一点,我并不完全知道你在做什么,但似乎你正试图扮演调度程序的角色,也就是说,睡觉为CPU提供时间做其他事情......

在少数情况下(确实很少)它可能是正确的,但大多数情况下你应该让调度程序完成它的工作,它可能比你知道的更多,并且可以使工作比你做的更好.

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有