繁体   English   中英

Thread.Sleep实现

[英]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
  • 持续时间参数= 0将导致当前线程屈服于另一个具有相同或更高优先级的线程。
  • 持续时间参数> 0将导致上下文切换,并且当前线程将保持等待状态,直到经过指定的时间(大约)为止。
  • 该线程将保持可警报状态,这意味着它被允许通过QueueUserAPC处理APC方法,并将响应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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM