Thread.Sleep实现

时间:2014-09-30 01:41:50

标签: c# multithreading

我很好奇Thread.Sleep是如何实施的。我看了一下Reflector来实现Thread.Sleep。它调用以下函数:

[MethodImpl(MethodImplOptions.InternalCall), SecurityCritical]
private static extern void SleepInternal(int millisecondsTimeout);

有谁知道定义的位置?我知道其他替代方案,例如Task.Delay。但对实际的实施细节感到好奇。

3 个答案:

答案 0 :(得分:3)

Joe Duffy的书“Concurrent Programming”提供了您需要的所有细节。但总结一下:

  • Thread.Sleep的行为类似于Win API函数SleepEx
  • 持续时间参数= 0将导致当前线程屈服于具有相同或更高优先级的另一个。
  • 持续时间参数> 0将导致上下文切换,并且当前线程将保持等待状态,直到超过指定的时间量(大约)。
  • 线程将保持警报状态,这意味着允许其通过QueueUserAPC处理APC方法,并将响应Thread.Interrupt次来电。

我建议通过SSCLI代码来更全面地了解它的实现方式。

关于你无法将线程重用于其他工作的问题......我有点困惑。 Thread.Sleep是一个自愿暂停,所以你(程序员)告诉线程不再做任何工作。就像我上面提到的那样,线程被认为是可警告的,所以你可以实际打断它,甚至强迫它通过APC方法工作。

有关在Thread.Sleep仍处于待处理状态时让.NET线程运行APC的详细信息,请参阅此question

答案 1 :(得分:1)

当系统线程(真实线程,而不是用户线程)调用时,

Thread.Sleep()是一个挂钩到OS内核调度内部的调用,类似于进程休眠。它将执行上下文(在内核进程级别可见)置于“休眠”等待状态,因此在唤醒之前它不会消耗CPU。这不是一个忙碌的等待。

如果您希望它清醒和/或做其他事情,请使用除Thread.Sleep()之外的其他一些机制。

答案 2 :(得分:0)

如果您希望重复使用该线程,请使用await Task.Delay()