[英]Thread.Sleep implementation
我对Thread.Sleep
是如何实现的很好奇。 我与Reflector一起了解了Thread.Sleep
的实现。 它调用以下函数:
[MethodImpl(MethodImplOptions.InternalCall), SecurityCritical]
private static extern void SleepInternal(int millisecondsTimeout);
有谁知道在哪里定义? 我知道其他替代方法,例如Task.Delay。 但是对实际的实施细节感到好奇。
Joe Duffy的书Concurrent Programming提供了您需要的所有详细信息。 但总结一下:
Thread.Sleep
行为类似于Win API函数SleepEx 。 Thread.Interrupt
调用。 我建议仔细阅读SSCLI代码,以更全面地了解其实现方式。
关于您无法将线程重用于其他工作的问题...我有些困惑。 Thread.Sleep
是自愿挂起的,因此您(程序员)告诉线程不要再做任何工作。 就像我在上面提到的那样,该线程被称为可警报的,因此您实际上可以中断它,甚至可以通过APC方法强制其执行工作。
有关使.NET线程在Thread.Sleep
仍挂起时运行APC的更多信息,请参考此问题 。
Thread.Sleep()
由系统线程(真实线程,而不是用户线程)调用时,是一个挂接到OS内核调度内部组件的调用,类似于进程睡眠。 它将执行上下文(在内核进程级别上可见)置于“睡眠”等待状态,因此在唤醒之前它不消耗CPU。 这不是一个繁忙的等待。
如果您希望它保持苏醒和/或执行其他操作,请使用Thread.Sleep()
之外的其他机制。
如果您想重用线程,请使用await Task.Delay()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.