kernel32.dll Sleep 和 Thread.Sleep() 之间的任何区别

Posted

技术标签:

【中文标题】kernel32.dll Sleep 和 Thread.Sleep() 之间的任何区别【英文标题】:Any difference between kernel32.dll Sleep and Thread.Sleep() 【发布时间】:2011-07-06 09:32:13 【问题描述】:

以下之间是否有任何区别(性能,实现。.whatever):

我)

DllImport("kernel32.dll")]
        public extern static void Sleep(uint msec);

..然后调用睡眠函数

ii)

Thread.Sleep()

【问题讨论】:

明显的区别在于,一个设计用于本机代码,另一个用于面向 .NET Framework 的托管代码。你能解释一下除了这个区别之外你想知道什么吗? 我们是否需要考虑使用替代形式,还是两者都会达到目的? 不,当您编写 C# 代码时,没有理由必须从 kernel32.dll 中 P/Invoke SleepThread.Sleep 会很好,是首选方法。 Ehh...你关心Sleep的性能吗? 【参考方案1】:

其实差别很大。

This blog post 解释了为什么托管线程不应该在可能的情况下进行非托管阻塞。 official MSDN documentation 具有相同的指导方针,但没有所有基本细节。

附: Thread.Sleep is a sign of a poorly-designed program.

【讨论】:

同意。为什么你会想要对托管线程进行非托管阻塞,当然,这超出了我的范围。【参考方案2】:

我不这么认为。它们都只在当前线程上工作。

在主线程中使用 Sleep 函数时要小心,因为依赖于同步时序的程序通常会在外部配置更改时出现问题。

在支持或监听线程中使用睡眠通常不是问题。

【讨论】:

以上是关于kernel32.dll Sleep 和 Thread.Sleep() 之间的任何区别的主要内容,如果未能解决你的问题,请参考以下文章

C# 延时函数 非Sleep

开机运行软件,出现kernel32.dll错误?求解决方案

用于 kernel32.dll API 的包装器 C#

Win32 32 位进程加载 64 位 kernel32.dll

如何包含我的非托管 dll 需要的 dll,例如 kernel32.dll

ubuntu 中 kernel32.dll 的等价物是啥?